我目前的方法是这样的:

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

===============>>#1 票数:32 已采纳

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

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

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

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

===============>>#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

        }
    }
});

===============>>#3 票数:3

有两个模块可以帮助您实现此目的:

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

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

===============>>#4 票数:1

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

===============>>#5 票数: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')
         }
}
})

  ask by TIMEX translate from so

未解决问题?本站智能推荐:

1回复

内容协商中的规范类型与请求类型

因此,我想知道对于返回的数据可能具有多种有效MIME类型的请求,如何使用HTTP内容协商进行处理。 例如,如果说我有一些具有以下可能的MIME类型的任意数据: 假设存在多种MIME类型,则从我的Web应用程序请求这种形式的数据的客户端应用程序应该合理地期望接收该类型的数据,而不管它
1回复

如何在浏览器中显示s3图像

如何在浏览器中显示s3图像,现在每次尝试在浏览器中打开它时都会下载。 我已经设置了内容类型,但是仍然面临着同样的问题。 这是我的代码
2回复

Apache为.js文件发送了错误的响应头

我注意到Chrome报告了.js文件的MIME类型错误。 这些文件由Apache 2提供,Apache 2最初在其conf文件中未引用js文件。 我在http.conf中添加了以下配置: 然后重新加载配置。 .js文件仍通过以下响应头发送: 没有.htaccess文件。
1回复

如何在Gulp任务中显式配置“ Content-Type”

由于最近的浏览器更改,我遇到了“ Refused to execute script because its MIME type is not executable并且此问题自行解决。 我希望能够将所有脚本文件的Content-Type显式配置为application / javascri
1回复

在Tomcat中更改.xml.gz的mime类型

我需要从Javascript(JQuery)提取xml gzip压缩数据文件,并且我希望浏览器在将它们传递给JS之前自动对其进行解压缩。 据我所知,如果服务器返回content-type: text/html和content-encoding x-gzip.的文件,则可以实现此目的cont
2回复

浏览器接受“经典” js脚本标签,但不接受ES6模块—带有节点http服务器的MIME错误

我想使用ES6模块,因此我决定将Node用作简单的Web服务器,以避免在本地进行操作时遇到的所有CORS相关错误。 现在,我在浏览器中得到了与MIME类型相关的错误,但我不太了解。 这是我的server.js文件: 如果尝试在浏览器中访问index.html文件,该文件包含以下代
1回复

设置Content-Type:在angular js发布请求中

我想知道在angularjs发布请求中如何以及在哪里指定内容类型:multipart / form-data? 请协助。 默认值似乎是“ application / json,text / plain”,不适用于图像/文件上传。 上面的代码总是回显不成功。
1回复

确定Google文档查看器是否适用于外部网址

我正在使用允许用户定义外部文档URL的CMS。 例如,以下外部URL指向PDF文档: http://xml.catmms.com/servlet/ImageServlet?imageId=C514418 尽管您无法通过查看网址来分辨这一点。 一些链接将指向PDF,其他链接将指
2回复

如何在node.js(express)中全局设置内容类型

我可能错了,但我无法在任何文档中找到它。 我正在尝试为任何响应设置全局内容类型并执行以下操作: 在定义我的路线之前。 出于某种原因,这不起作用。 你知道我做错了什么吗? 在每个方法中单独设置它,但是我想要全局...
3回复

是否需要在Node.js中设置Content-Type?

刚开始使用Node.js,看到一些示例后,我看到通常在返回一些内容之前先设置Content-Type 。 对于HTML通常是这样的: 对于图像: 我阅读了.write()的文档 ,它说如果未指定标头,“它将切换到隐式标头模式并刷新隐式标头” 经过一些测试,我发现我可以