Node.js получить расширение файла

Я создаю функцию загрузки файла в node.js с помощью Express 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);
});

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

 just somebody02 июн. 2012 г., 21:52
@Jojje, так что решись. Названиеand основная часть вашего вопроса просит найти способ распознать файлtype, Так в чем именно твоя проблема? Покажите нам некоторый код, скажите, что вы ожидаете от него, и что он делает вместо этого.
 bill automata02 июн. 2012 г., 21:39
 georgesamper02 июн. 2012 г., 21:42
Разве это не вопрос о MIME-типах, я хочу расширение файла

Ответы на вопрос(9)

var fileName = req.files.upload.name;

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

var extension = arr[length-1];
 14 дек. 2015 г., 10:08
Попробуйте добавить объяснение к вашему ответу. Таким образом, ОП может действительно понять, что вы сделали и почему вы это сделали. Таким образом, ОП может учиться на вашем ответе, а не просто копировать / вставлять его.
 14 дек. 2015 г., 10:00
откуда берется переменная длины?
Решение Вопроса

что вы можете сделать следующее, чтобы получить расширение имени файла.

var path = require('path')

path.extname('index.html')
// returns
'.html'
 06 мая 2016 г., 11:24
В этом случае просто используйтеfilename.split('.').pop();
 16 июл. 2016 г., 08:43
@AamirAfridi, который возвращает ту же строку только без..
 31 июл. 2017 г., 23:53
Пытаться'filename.css.gz'.split('.').slice(1).join('.') получитьall расширения
 23 февр. 2014 г., 07:21
Только будьте осторожны, он будет захватывать символы только после последней точки, поэтому имена файлов, такие какapp.css.gz вернется только.gz и не.css.gz, который может или не может быть тем, что вы хотите.
 15 февр. 2018 г., 00:06
Обычно расширение является последним. И когда мы ожидаем более одного, например, tar.gz. Лучше проверить, существует ли он в конце концов или нет. используя регулярное выражение, например. & Quot; tar.gz $ & Quot; или путем создания функции, которая делает это. как проверить это с конца и вернуться назад и посмотреть, полностью ли это соответствует. и у вас будет эта функция, которая проверяет расширение.WHY? because what about files like jone.lastTest.654654556.tar.gz here the extension that's expected is tar.gz but if you apply any function that give form 1st dot, it will not work as you can see

которое решает проблему многократного продления периода:

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'

Убедитесь, что у файла тоже есть расширение.

path.extname сделает свое дело в большинстве случаев. Тем не менее, он будет включать в себя все после последнего., включая строку запроса и хеш-фрагмент запроса http:

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.

substr() метод вместоsplit() & Амп;pop()

Посмотрите на различия в производительности здесь:http://jsperf.com/remove-first-character-from-string

// returns: 'html'
var path = require('path');
path.extname('index.html').substr(1);

enter image description here

что отображение заголовка Content-Type в запросе также будет работать. Это будет работать даже в тех случаях, когда вы загружаете файл без расширения. (когда имя файла не имеет расширения в запросе)

Предположим, вы отправляете свои данные, используя 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 Content-Type header содержит тип mime данных. Сопоставление этого типа MIME с расширением даст вам расширение файла :).

Restify BodyParser преобразует этот заголовок в свойство с именемtype

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-types

и их использование также просто:

 app.post('/upload2', function (req, res) {
  console.log(mime.extension(req.files.image.type));
 }

выше фрагмент напечатаетpng утешить.

Update

Так как оригинальный ответ,extname () был добавлен кpath модуль, см. ответ Snowfish

Original answer:

Я использую эту функцию, чтобы получить расширение файла, потому что я не нашел способа сделать это более простым способом (но я думаю, что есть):

function getExtension(filename) {
    var ext = path.extname(filename||'').split('.');
    return ext[ext.length - 1];
}

Вы должны требовать «путь» использовать это.

другой метод, который не использует модуль пути:

function getExtension(filename) {
    var i = filename.lastIndexOf('.');
    return (i < 0) ? '' : filename.substr(i);
}
 23 февр. 2014 г., 07:20
Вы действительно должны просто использовать модуль пути, как указано в ответе @ Snowfish, а не писать свой собственный. Больше информации:nodejs.org/api/path.html#path_path_extname_p
 georgesamper02 июн. 2012 г., 22:32
Да, это работает. Просто подумал, что будет проще использовать узел. Вот что я сделал:var is = fs.createReadStream(req.files.upload.path), fileType = is.path.split(/[. ]+/).pop();

Это решение поддерживает строки запросов!

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'
 31 окт. 2016 г., 17:21
# Аамир Африди все еще работает
 14 дек. 2015 г., 10:00
откуда берется переменная длины?
 14 дек. 2015 г., 10:08
Попробуйте добавить объяснение к вашему ответу. Таким образом, ОП может действительно понять, что вы сделали и почему вы это сделали. Таким образом, ОП может учиться на вашем ответе, а не просто копировать / вставлять его.
 06 мая 2016 г., 11:22
Что делать, если имя файлаMvv4bx8.something.else.jpg
// you can send full url here
function getExtension(filename) {
    return filename.split('.').pop();
}

Если вы используете экспресс, добавьте следующую строку при настройке промежуточного программного обеспечения (bodyParser)

app.use(express.bodyParser({ keepExtensions: true}));

Ваш ответ на вопрос