My current method is this:
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 ?????
});
});
The image is obviously a picture, but node-mime
says it's application/octet-stream
. Why?
Note: - I do not want to rely on the Response Headers content-type, because based on my experience, sometimes those response headers are set incorrectly...and they do not determine the true file type. (that's why I save it to a file, and then have node-mime determine it for me!)
I want to know the best way to determine if a file is an image, with 0 margin of error.
Edit: I just realized that node-mime isn't "magic". It just checks for the extension :( ...
Edit2: I found this: https://github.com/SaltwaterC/mime-magic
i developped this code and i test it and it work for me you can use it
In the intervening time since this question was first asked, mime-magic has become unsupported and its author recommends the use of mmmagic. I don't know what happened to node-mime, the link above is a 404. I found the following article which discusses the topic as well: https://nodejsmodules.org/tags/mime
Just read the first bytes of the stream, and check it for the so called "magic number".
For example:
-Every JPEG file begins with
ff d8
(hex).-Every png file begins with a
89 50 4e 47
.-There is a full table of magic numbers here
This way even if you have a file without extension you can still detect its type.
Hope this helps.
This code shows a working solution for the magic numbers approach (summary of the existing answers and information on https://github.com/request/request).
There are two modules that can help you achieve this:
https://github.com/SaltwaterC/mime-magic
https://github.com/bentomas/node-mime