Вопрос по javascript, node.js – Node.js получить расширение файла

141

Я создаю функцию загрузки файла в 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?

Разве это не вопрос о MIME-типах, я хочу расширение файла georgesamper
stackoverflow.com/questions/10431845/… повторение? bill automata
@Jojje, так что решись. Названиеand основная часть вашего вопроса просит найти способ распознать файлtype, Так в чем именно твоя проблема? Покажите нам некоторый код, скажите, что вы ожидаете от него, и что он делает вместо этого. just somebody

Ваш Ответ

9   ответов
2
var fileName = req.files.upload.name;

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

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

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

var path = require('path')

path.extname('index.html')
// returns
'.html'
Обычно расширение является последним. И когда мы ожидаем более одного, например, 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
Пытаться'filename.css.gz'.split('.').slice(1).join('.') получитьall расширения
В этом случае просто используйтеfilename.split('.').pop();
@AamirAfridi, который возвращает ту же строку только без..
Только будьте осторожны, он будет захватывать символы только после последней точки, поэтому имена файлов, такие какapp.css.gz вернется только.gz и не.css.gz, который может или не может быть тем, что вы хотите.
11

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

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'
# Аамир Африди все еще работает
откуда берется переменная длины?
Попробуйте добавить объяснение к вашему ответу. Таким образом, ОП может действительно понять, что вы сделали и почему вы это сделали. Таким образом, ОП может учиться на вашем ответе, а не просто копировать / вставлять его.
Что делать, если имя файлаMvv4bx8.something.else.jpg
1

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.

8

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

6

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

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'

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

3

что отображение заголовка 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 утешить.

17
// you can send full url here
function getExtension(filename) {
    return filename.split('.').pop();
}

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

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

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);
}
Да, это работает. Просто подумал, что будет проще использовать узел. Вот что я сделал:var is = fs.createReadStream(req.files.upload.path), fileType = is.path.split(/[. ]+/).pop(); georgesamper
Вы действительно должны просто использовать модуль пути, как указано в ответе @ Snowfish, а не писать свой собственный. Больше информации:nodejs.org/api/path.html#path_path_extname_p

Похожие вопросы