我目前的方法是这样的:
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不是“魔术”。它只是检查扩展名:( ...
编辑2:我发现了这个:https://github.com/SaltwaterC/mime-magic
只需读取流的第一个字节,然后检查它是否为所谓的“幻数”。
幻数是文件的第一位,它唯一地标识文件的类型。
例如:
- 每个JPEG文件都以ff d8
(hex)开头。
- 每个png文件都以89 50 4e 47
开头。
- 有一个全面的魔术数字表here
这样,即使您有一个没有扩展名的文件,您仍然可以检测其类型。 希望这可以帮助。
此代码显示了魔术数字方法的工作解决方案(现有答案的摘要和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
}
}
});
在这个问题首次提出以来的间隔期间,mime-magic已经不受支持,其作者建议使用mmmagic。我不知道node-mime发生了什么,上面的链接是404.我发现以下文章也讨论了这个主题:https://nodejsmodules.org/tags/mime
我开发了这个代码,我测试它,它适用于我,你可以使用它
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')
}
}
})