In Node.js, given a URL, how do I check whether its a jpg/png/gif?

Just read the first bytes of the stream, and check it for the so called "magic number".

Magic numbers are the first bits of a file which uniquely identify the type of file.

For example:
-Every JPEG file begins with ff d8 (hex).
-Every png file begins with a 89 50 4e 47.
-There is a comprehensive table of magic numbers here

This way even if you have a file without extension you can still detect its type.
Hope this helps.


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


This code shows a working solution for the magic numbers approach (summary of the existing answers and information on 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

        }
    }
});

There are two modules that can help you achieve this:

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

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