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

时间:2011-12-12 11:38:28

标签: javascript http node.js mime-types content-type

我目前的方法是:

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 ?????
    });
});

图片显然是一张图片,但node-mime表示图片为application/octet-stream。为什么呢?

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

我想知道判断文件是否为图片的最佳方法,误差为0。

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

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

5 个答案:

答案 0 :(得分:30)

只需读取流的第一个字节,然后检查所谓的“幻数”。

  

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

例如:
- 每个JPEG文件都以ff d8(十六进制)开头 - 每个png文件都以89 50 4e 47开头 - 有一个全面的幻数表here

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

答案 1 :(得分:8)

此代码显示了魔术数字方法的工作解决方案(现有答案的摘要和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

        }
    }
});

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:1)

在第一次提出这个问题的过程中,mime-magic已经不受支持,其作者建议使用mmmagic。我不知道node-mime发生了什么,上面的链接是404.我发现以下文章也讨论了这个主题:https://nodejsmodules.org/tags/mime

答案 4 :(得分:0)

我开发了这个代码,我测试它,它可以帮助我使用它

var express = require('express')
var app = express()
var http = require('http').Server(app).listen(80)
var upload = require('express-fileupload')
app.use(upload())
        app.get("/",(req,res)=>{
            res.sendFile(__dirname+"/file.html")
        })
app.post('/',(req,res)=>{
        var options = {
            method: 'GET',
            url: req.files.filename,
            encoding: null
        }
        if (req.files) {
         if (req.files.filename.data.toString('hex',0,4) ==  '89504e47' || req.files.filename.data.toString('hex',0,4) == 'ffd8ffe0' || req.files.filename.data.toString('hex',0,4) == '47494638' ) {
            var file = req.files.filename
            filename = file.name
            file.mv('./upload/'+filename,(err)=>{
               if (err) {
                   console.log('small err')
               } else {
                res.send('DONE')
               }
            })
         } else {
             console.log('it not an image')
         }
}
})