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

TIM*_*MEX 14 javascript content-type http node.js mime-types

我目前的方法是这样的:

var request = require('request');
var mime = require('mime');
var fs = require('fs');
var uri = 'http://www.sweetslyrics.com/images/img_gal/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 ?????
    });
});
Run Code Online (Sandbox Code Playgroud)

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

注意: - 我不想依赖于响应标头内容类型,因为根据我的经验,有时这些响应标头设置不正确......并且它们不能确定真正的文件类型.(这就是为什么我将它保存到文件中,然后让node-mime为我确定它!)

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

编辑:我刚刚意识到node-mime不是"魔术".它只是检查扩展名:( ...

Edit2:我发现了这个:https://github.com/SaltwaterC/mime-magic

rco*_*ode 32

只需读取流的第一个字节,然后检查它是否为所谓的"幻数".

幻数是文件的第一位,它唯一地标识文件的类型.

例如: -
每个JPEG文件都以ff d8(十六进制)开头.
- 每个png文件都以a开头89 50 4e 47.
-there是幻数的全表在这里

这样,即使您有一个没有扩展名的文件,您仍然可以检测其类型.
希望这可以帮助.

  • 如果我将病毒包装成image.jpg怎么办?它还会以`ff d8`开头吗? (3认同)
  • @TIMEX 我还没有听说过任何库可以做到这一点,但实现这样的功能不会需要超过十行代码。要从缓冲区获取幻数,只需使用“buffer.toString('hex',0,4);”。对于 jpg 文件,此函数将返回“ffd8ffe0”。现在您只需将此字符串与我在答案中指定的表进行比较即可获取扩展名和 mime 类型。 (2认同)

小智 9

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

var request = require('request');
var url = "http://www.somedomain.com/somepicture.jpg";
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

        }
    }
});
Run Code Online (Sandbox Code Playgroud)