Узел.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);
});


Как я могу получить расширение изображения в узел.Джей?

534   9  

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 в консоли.

var fileName = req.files.upload.name;

var arr = fileName.split('.');

var extension = arr[length-1];

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

    Ничего не найдено.