2012-06-02 3 views
115

Im создавая функцию загрузки файлов в Node.js с экспрессом 3.Node.js получить расширение файла

Я хотел бы, чтобы захватить расширение файла изображения. поэтому я могу переименовать файл, а затем добавить к нему расширение файла.

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?

+0

http://stackoverflow.com/questions/10431845/node-js-file-system-get-file-type repeat? –

+1

Разве это не вопрос о mime-типах, я хочу расширение файла – georgesamper

+1

@Jojje так решай. Заголовок * и * тело вашего вопроса запрашивают способ распознать тип файла *. Так в чем же проблема? Покажите нам какой-нибудь код, скажите нам, что вы ожидаете от него, и что он делает. –

ответ

270

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

var path = require('path') 

path.extname('index.html') 
// returns 
'.html' 
+26

Просто будьте осторожны, он будет захватывать только символы после последней точки, поэтому имена файлов, такие как 'app.css.gz', будут возвращаться только'. gz', а не '.css.gz', который может быть или не быть тем, что вы хотите. – xentek

+9

В этом случае просто используйте 'filename.split ('.'). Pop();' –

+7

@AamirAfridi Это возвращает ту же строку только без '.'. – undefined

28

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

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); 
} 
+2

Да, это работает. Просто подумал, что проще будет использовать узел. Это то, что я сделал: 'var is = fs.createReadStream (req.files.upload.path), fileType = is.path.split (/ [.] + /). Pop();' – georgesamper

+5

Вы действительно должны просто использовать модуль пути, так как ответ @ Snowfish указал, а не писать свои собственные. Дополнительная информация: http://nodejs.org/api/path.html#path_path_extname_p – xentek

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

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

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

Это намного более эффективно использовать substring() метод вместо split() & pop()

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

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

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.

1
var fileName = req.files.upload.name; 

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

var extension = arr[length-1]; 
+0

, где от переменной длины? –

+1

Попытайтесь добавить какое-то объяснение к вашему ответу. Таким образом, ОП может реально понять, что вы сделали и почему вы это сделали. Таким образом, OP может учиться на вашем ответе, а не просто копировать/вставлять его. – Oldskool

5

Простое решение без необходимости требовать, который решает несколько проблемы расширения периода:

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' 

Убедитесь в проверьте, что файл имеет расширение.

8

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

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' 
+0

Что делать, если имя файла 'Mvv4bx8.something.else.jpg' –

+0

#Aamir Afridi все еще работает – user956584

2

Я действительно думаю, что отображение заголовка 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 с расширением даст вам расширение файла :).

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

  • мим
  • мим-типы

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

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

над фрагментом будет печатать png для консоли.

Смежные вопросы