Ответ 1
Я считаю, что вы можете сделать следующее, чтобы получить расширение имени файла.
var path = require('path')
path.extname('index.html')
// returns
'.html'
Я создаю функцию загрузки файла в node.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);
});
Как я могу получить расширение изображения в node.js?
Я считаю, что вы можете сделать следующее, чтобы получить расширение имени файла.
var path = require('path')
path.extname('index.html')
// returns
'.html'
Обновить
После первоначального ответа extname() был добавлен в модуль path
, см. Ответ Snowfish.
Оригинальный ответ:
Я использую эту функцию, чтобы получить расширение файла, потому что я не нашел способ сделать это более простым способом (но я думаю, что есть):
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);
}
// you can send full url here
function getExtension(filename) {
return filename.split('.').pop();
}
Если вы используете экспресс, добавьте следующую строку при настройке промежуточного программного обеспечения (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'
Намного эффективнее использовать метод substr()
вместо split()
& pop()
Посмотрите на различия в производительности здесь: http://jsperf.com/remove-first-character-from-string
// returns: 'html'
var path = require('path');
path.extname('index.html').substr(1);
Обновление августа 2019 года
Как указано @xentek в комментариях; substr()
теперь считается устаревшей функцией (документация MDN). Вместо этого вы можете использовать substring()
. Разница между substr()
и substring()
заключается в том, что второй аргумент substr()
- это максимальная длина для возврата, в то время как второй аргумент substring()
- это индекс, на котором нужно остановиться (без включения этого символа). Кроме того, substr()
принимает отрицательные начальные позиции для использования в качестве смещения от конца строки, в то время как substring()
нет.
Простое решение без необходимости требовать, которое решает проблему расширения множественного периода:
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'
Убедитесь, что у файла есть расширение.
Я думаю, что отображение заголовка 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--
Здесь заголовок Content-Type содержит тип mime данных. Сопоставление этого типа mime с расширением даст вам расширение файла:).
Restor 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
и их использование также прост:
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
.
Следующая функция разбивает строку и возвращает имя и расширение независимо от того, сколько точек в расширении. Возвращает пустую строку для расширения, если ее нет. Имена, начинающиеся с точек и/или пробелов, также работают.
function basext(name) {
name = name.trim()
const match = name.match(/^(\.+)/)
let prefix = ''
if (match) {
prefix = match[0]
name = name.replace(prefix, '')
}
const index = name.indexOf('.')
const ext = name.substring(index + 1)
const base = name.substring(0, index) || ext
return [prefix + base, base === ext ? '' : ext]
}
const [base, ext] = basext('hello.txt')
импортировать extname, чтобы вернуть расширение файла:
import { extname } from 'path';
extname(file.originalname);
где файл - это имя файла формы