Узел.JS получить расширение файла
Im создает функцию загрузки файла в узле.js с курьерским 3.
Я хотел бы захватить расширение файла изображения. поэтому я могу переименовать файл, а затем добавить расширение к нему.
app.post('/upload', function(req, res, next) {
var is = fs.createReadStream(req.files.upload.path),
fileExt = >>>> I want to get the extension of the image here <<<<,
os = fs.createWriteStream('public/images/users/' + req.session.adress + '.' + fileExt);
});
Как я могу получить расширение изображения в узел.Джей?
9 ответов:
Я считаю, вы можете сделать следующее, Чтобы получить расширение имени файла.
var path = require('path') path.extname('index.html') // returns '.html'
обновление
Так как оригинальный ответ,extname() добавлено
pathмодуль, см. Snowfish answerоригинальный ответ:
Я использую эту функцию, чтобы получить расширение файла, потому что я не нашел способ сделать это проще (но я думаю, что есть) :
function getExtension(filename) { var ext = path.extname(filename||'').split('.'); return ext[ext.length - 1]; }вы должны требовать 'путь', чтобы использовать его.
другой метод, который не использует модуль Path :
function getExtension(filename) { var i = filename.lastIndexOf('.'); return (i < 0) ? '' : filename.substr(i); }
// you can send full url here function getExtension(filename) { return filename.split('.').pop(); }Если вы используете экспресс, пожалуйста, добавьте следующую строку при настройке middleware (bodyParser)
app.use(express.bodyParser({ keepExtensions: true}));
Это решение поддерживает querystrings!
var Url = require('url'); var Path = require('path'); var url = 'http://i.imgur.com/Mvv4bx8.jpg?querystring=true'; var result = Path.extname(Url.parse(url).pathname); // '.jpg'
гораздо эффективнее использовать
substring()вместоsplit()&pop()посмотрите на различия в производительности здесь:http://jsperf.com/remove-first-character-from-string
// returns: 'html' var path = require('path'); path.extname('index.html').substring(1);
простое решение без необходимости требовать, которое решает проблему расширения нескольких периодов:
var filename = 'file.with.long.extension'; var ext = filename.substring(filename.indexOf('.')); //ext = '.with.long.extension'или если вы не хотите, точки:
var filename = 'file.with.long.extension'; var ext = filename.substring(filename.indexOf('.')+1); //ext = 'with.long.extension'проверьте, что файл имеет расширение.
Я думаю, что отображение заголовка типа контента в запросе также будет работать. Это будет работать даже в тех случаях, когда вы загружаете файл без расширения. (когда имя файла не имеет расширения в запросе)
Предположим, вы отправляете свои данные с помощью HTTP POST:
POST /upload2 HTTP/1.1 Host: localhost:7098 Connection: keep-alive Content-Length: 1047799 Accept: */* Origin: http://localhost:63342 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 Content-Type: multipart/form-data; boundary=---- WebKitFormBoundaryPDULZN8DYK3VppPp Referer: http://localhost:63342/Admin/index.html? _ijt=3a6a054pasorvrljf8t8ea0j4h Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.8,az;q=0.6,tr;q=0.4 Request Payload ------WebKitFormBoundaryPDULZN8DYK3VppPp Content-Disposition: form-data; name="image"; filename="blob" Content-Type: image/png ------WebKitFormBoundaryPDULZN8DYK3VppPp--здесь заголовок типа содержимого name содержит тип mime данных. Сопоставление этого типа mime с расширением даст вам расширение файла:).
restify выглядит следующим образом BodyParser преобразует этот заголовок в свойство с именем тип
File { domain: Domain { domain: null, _events: { .... }, _eventsCount: 1, _maxListeners: undefined, members: [ ... ] }, _events: {}, _eventsCount: 0, _maxListeners: undefined, size: 1047621, path: '/tmp/upload_2a4ac9ef22f7156180d369162ef08cb8', name: 'blob', **type: 'image/png'**, hash: null, lastModifiedDate: Wed Jul 20 2016 16:12:21 GMT+0300 (EEST), _writeStream: WriteStream { ... }, writable: true, domain: Domain { ... }, _events: {}, _eventsCount: 0, _maxListeners: undefined, path: '/tmp/upload_2a4ac9ef22f7156180d369162ef08cb8', fd: null, flags: 'w', mode: 438, start: undefined, pos: undefined, bytesWritten: 1047621, closed: true } }вы можете использовать этот заголовок и выполните сопоставление расширения (подстроки и т. д...) вручную, но есть и готовые библиотеки для этого. Ниже двух были лучшие результаты, когда я сделал поиск google
- mime
- mime-типы
и их использование также просто:
app.post('/upload2', function (req, res) { console.log(mime.extension(req.files.image.type)); }выше фрагмент будет печатать png в консоли.
path.extnameбудет делать трюк в большинстве случаев. Однако, он будет включать в себя все после последнего., включая строку запроса и хэш-фрагмент http-запроса:var path = require('path') var extname = path.extname('index.html?username=asdf') // extname contains '.html?username=asdf'в таких случаях, вы хотите попробовать что-то вроде этого:
var regex = /[#\?]/g; // regex of illegal extension characters var extname = path.extname('index.html?username=asdf'); var endOfExt = extname.search(regex); if (endOfExt > -1) { extname = extname.substring(0, endOfExt); } // extname contains '.html'обратите внимание, что расширения с несколькими периодами (например,
.tar.gz), не работает сpath.extname.
Comments