Node.js获取文件扩展名

我创build一个file uploadfunction在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('publichttp://img.dovov.comusers/' + req.session.adress + '.' + fileExt); }); 

我怎样才能得到在node.js图像的扩展?

我相信你可以做下面的事情来获得文件名的扩展名。

 var path = require('path') path.extname('index.html') // returns '.html' 

我使用这个函数来得到一个文件扩展名,因为我没有find一个方法来做一个更简单的方法(但我认为是):

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

你必须要求“path”来使用它。

另一种不使用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(); } 

如果您使用快递,请在configuration中间件(bodyParser)时添加以下行

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

这个解决scheme支持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); 

一个简单的解决scheme,不需要解决多周期扩展问题:

 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' 

请确保testing该文件也有一个扩展名。

我认为在请求中映射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头包含数据的MIMEtypes。 将这个MIMEtypes映射到一个扩展将得到你的文件扩展名:)。

Restify BodyParser将此标题转换为名称types的属性

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

你可以使用这个头文件,并手动执行扩展映射(子串等),但也有这样的现成的库。 下面两个是我做了谷歌search的最好的结果

  • 哑剧
  • MIMEtypes

而且它们的使用也很简单:

  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请求的查询string和散列片段:

 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完全path.extname