In Node.js, dato un URL, come posso verificare se è un jpg / png / gif?

Il mio metodo attuale è questo:

var request = require('request'); var mime = require('mime'); var fs = require('fs'); var uri = 'http://sofit.miximages.com/javascript/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 ????? }); }); 

L’immagine è ovviamente un’immagine, ma node-mime dice che è application/octet-stream . Perché?

Nota: – Non voglio fare affidamento sul tipo di contenuto delle intestazioni di risposta, perché in base alla mia esperienza, a volte tali intestazioni di risposta sono impostate in modo errato … e non determinano il vero tipo di file. (questo è il motivo per cui l’ho salvato su un file, e poi ho fatto in modo che node-mime lo determini!)

Voglio sapere il modo migliore per determinare se un file è un’immagine, con 0 margine di errore.

Edit: Ho appena realizzato che node-mime non è “magico”. Controlla solo l’estensione 🙁 …

Edit2: ho trovato questo: https://github.com/SaltwaterC/mime-magic

Basta leggere i primi byte dello stream e controllarlo per il cosiddetto “numero magico”.

I numeri magici sono i primi bit di un file che identificano univocamente il tipo di file.

Per esempio:
-Ogni file JPEG inizia con ff d8 (hex).
-Ogni file png inizia con un 89 50 4e 47 .
-Vi è una tabella completa di numeri magici qui

In questo modo, anche se si dispone di un file senza estensione, è ancora ansible rilevare il suo tipo.
Spero che questo ti aiuti.

Questo codice mostra una soluzione di lavoro per l’approccio ai numeri magici (riassunto delle risposte esistenti e informazioni su https://github.com/request/request ).

 var request = require('request'); var url = "http://sofit.miximages.com/javascript/f"; 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 } } }); 

Ci sono due moduli che possono aiutarti a raggiungere questo objective:

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

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

Nel frattempo, da quando è stata posta questa domanda, la magia mimica non è stata supportata e il suo autore raccomanda l’uso di mmmagic . Non so cosa sia successo a node-mime, il link sopra è un 404. Ho trovato il seguente articolo che discute anche l’argomento: https://nodejsmodules.org/tags/mime

ho sviluppato questo codice e lo collaudo e funziona per me puoi usarlo

 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') } } })