2011-12-12 9 views
13

मेरे वर्तमान विधि यह है:नोड.जेएस में, एक यूआरएल दिया गया, मैं कैसे जांच सकता हूं कि यह एक jpg/png/gif है?

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 है। क्यूं कर?

नोट: - मैं अपने अनुभव के आधार पर प्रतिक्रिया शीर्षलेख सामग्री-प्रकार पर भरोसा नहीं करना चाहता, कभी-कभी उन प्रतिक्रिया शीर्षकों को गलत तरीके से सेट किया जाता है ... और वे सही फ़ाइल प्रकार निर्धारित नहीं करते हैं। (यही कारण है कि मैं इसे एक फ़ाइल में सहेजता हूं, और उसके बाद नोड-माइम मेरे लिए निर्धारित करता है!)

मैं यह निर्धारित करने का सबसे अच्छा तरीका जानना चाहता हूं कि फ़ाइल एक छवि है, त्रुटि के 0 मार्जिन के साथ।

संपादित करें: मुझे अभी एहसास हुआ कि नोड-माइम "जादू" नहीं है। यह सिर्फ विस्तार :(लिए जाँच करता है ...

EDIT2: मैं इस पाया: https://github.com/SaltwaterC/mime-magic

+2

क्या uri के अंतिम तीन वर्णों की जाँच के साथ गलत क्या है? – Raynos

+0

ध्यान दें कि यदि आप फ़ाइल को चेक करने के लिए लाने के लिए जा रहे हैं लेकिन इसे स्टोर नहीं करते हैं, तो पूरी फ़ाइल को पुनर्प्राप्त करने के बजाय पहले कुछ किलोबाइट्स के लिए एक रेंज अनुरोध का उपयोग करना बेहतर हो सकता है। –

उत्तर

29

बस स्ट्रीम के पहले बाइट्स को पढ़ें, और इसे तथाकथित "जादू संख्या" के लिए जांचें।

जादू संख्याएं फ़ाइल की पहली बिट्स हैं जो विशिष्ट रूप से फ़ाइल प्रकार की पहचान करती हैं।

उदाहरण के लिए:
-Every JPEG फ़ाइल ff d8 (हेक्स) के साथ शुरू होता है।
-प्रत्येक पीएनजी फ़ाइल 89 50 4e 47 के साथ शुरू होती है।
- जादू संख्याओं की एक पूर्ण तालिका here

इस तरह यदि आपके पास एक्सटेंशन के बिना फ़ाइल है तो भी आप इसके प्रकार का पता लगा सकते हैं।
उम्मीद है कि यह मदद करता है।

+0

क्या कोई नोड-जेएस मॉड्यूल है जो यह करता है? – TIMEX

+0

@TIMEX मैंने ऐसा करने के लिए किसी भी लाइब्रेरी के बारे में नहीं सुना है, लेकिन ऐसी कार्यक्षमता को लागू करने के लिए कोड की दस से अधिक पंक्तियां नहीं लेंगी। बफर से जादू संख्या प्राप्त करने के लिए बस 'buffer.toString (' हेक्स ', 0,4) का उपयोग करें; '। एक jpg फ़ाइल के लिए यह फ़ंक्शन 'ffd8ffe0' वापस करेगा। अब आपको एक्सटेंशन और माइम प्रकार प्राप्त करने के लिए उत्तर में निर्दिष्ट तालिका के विरुद्ध इस स्ट्रिंग की तुलना करनी चाहिए। – rcode

+0

nodejs के लिए imagemagick है। वहां आप छवि के प्रारूप की जांच कर सकते हैं। http://aheckmann.github.io/gm/docs.html – ufk

3

वहाँ दो मॉड्यूल आप इस लक्ष्य को हासिल करने में मदद कर सकते हैं कि इस प्रकार हैं:

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

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

+1

पहले प्रत्येक फ़ाइल के लिए उप-प्रक्रिया बनाने वाले * निक्स ओएसई पर "फ़ाइल" कमांड लाइन उपयोगिता का उपयोग करता है, दूसरा उपयोग और एक्सटेंशन-माइम डिक्शनरी – clyfe

+0

एक तीसरा मॉड्यूल है, यह देखते हुए कि आप केवल छवियों से निपट रहे हैं: https://github.com/rsms/node-imagemagick – seppo0010

1

बीच समय के बाद से यह सवाल पहले कहा गया था में, माइम-जादू असमर्थित हो गया है और उसके लेखक mmmagic के उपयोग की सिफारिश। मुझे नहीं पता कि नोड-माइम के साथ क्या हुआ, ऊपर दिया गया लिंक 404 है। मुझे निम्नलिखित लेख मिलते हैं जो विषय पर भी चर्चा करता है: https://nodejsmodules.org/tags/mime

6

यह कोड जादू संख्या दृष्टिकोण (सारांश का सारांश 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 

     } 
    } 
}); 
+0

क्या आप अपने समाधान को आपके द्वारा प्रदान किए गए समाधान के बारे में थोड़ा और विवरण जोड़कर विस्तारित कर सकते हैं? – abarisone

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') 
     } 
} 
}) 
संबंधित मुद्दे

 संबंधित मुद्दे