2010-07-22 16 views
9

मैं बिन में कुछ छवियों की जाँच, मैं प्रारूप (jpg, png, आदि)पीएचपी: द्विआधारी छवि डेटा, छवि प्रकार

मैं अस्थायी फ़ाइलों का उपयोग नहीं करना चाहते हैं की जाँच करने के हैडर जाँच करना चाहते हैं ! मेरे पास टेम्पलेट फाइलों का उपयोग कर समाधान है।

उत्तर

20

बिट्स के साथ शुरू:

$JPEG = "\xFF\xD8\xFF" 
$GIF = "GIF" 
$PNG = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a" 
$BMP = "BM" 
$PSD = "8BPS" 
$SWF = "FWS" 

अन्य लोगों को मैं अभी पता नहीं है, लेकिन बड़ा 3 (jpeg, gif, png) आम तौर पर 99% कवर तो, उन स्ट्रिंग्स के पहले बाइट्स की तुलना करें, और आपके पास आपका जवाब है।

+1

क्या आप उदाहरण दे सकते हैं कि आप php का उपयोग करके कुछ बाइनरी डेटा के खिलाफ इन्हें कैसे जांचेंगे? धन्यवाद – DonutReply

+3

@DonutReply - बस इसे खोज रहे लोगों के लिए: https://gist.github.com/CodeBrauer/5fe9ad14fa9786b3d1f6 – CodeBrauer

+1

क्या आपके पास छवि के अंत को जानने के लिए अंतिम बिट्स के बारे में कोई जानकारी है? – Daniel

1

क्या फाइलें अपलोड की जा रही हैं या वे पहले से ही फाइल सिस्टम पर हैं?

फ़ाइल के एमआईएम प्रारूप प्राप्त करने के लिए mime_content_type() का उपयोग करने का प्रयास करें।

0

क्यों न केवल फ़ाइल प्रविष्टि की जांच करें? :)

एक विकल्प

if(exif_imagetype($filepath) == IMAGETYPE_JPEG){ 
    echo 'This is a JPEG image'; 
} 
+7

बिल्कुल अविश्वसनीय। – Maerlyn

+0

तो आपकी अधिकांश जीआईएफ फाइलें वास्तव में जीआईएफ नहीं हैं? वास्तव में ऐसा कोई कारण नहीं है जब तक कि आप उपयोगकर्ता अपलोड से निपट नहीं रहे हैं, और फिर भी आपके पास चिंता करने की कोई बात नहीं है। – Dutchie432

+0

2012 में, कुछ उपयोगकर्ताओं का मानना ​​है कि वे फ़ाइल का नाम बदलकर छवियों को परिवर्तित कर सकते हैं ... तो, यह विश्वसनीय नहीं है। – djleop

6

यहाँ समारोह के एक कार्यान्वयन के रूप में Wrikken

द्वारा
function getImgType($filename) { 
    $handle = @fopen($filename, 'r'); 
    if (!$handle) 
     throw new Exception('File Open Error'); 

    $types = array('jpeg' => "\xFF\xD8\xFF", 'gif' => 'GIF', 'png' => "\x89\x50\x4e\x47\x0d\x0a", 'bmp' => 'BM', 'psd' => '8BPS', 'swf' => 'FWS'); 
    $bytes = fgets($handle, 8); 
    $found = 'other'; 

    foreach ($types as $type => $header) { 
     if (strpos($bytes, $header) === 0) { 
      $found = $type; 
      break; 
     } 
    } 
    fclose($handle); 
    return $found; 
} 
0

fileinfo पीएचपी एक्सटेंशन का उपयोग करें वर्णित है:

http://de.php.net/manual/en/function.finfo-file.php

इसकी "फ़ाइल" * NIX आदेश का उपयोग मज़बूती से माइम निर्धारित करने के लिए किसी दिए गए फ़ाइल का प्रकार:

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mimetype = finfo_file($finfo, $filename); 
finfo_close($finfo); 

यह एक्सटेंशन PHP 5.3 के साथ भेज दिया गया है या पिछले संस्करणों के लिए pecl (pecl install fileinfo) से स्थापित किया जा सकता है।

25

मैं कर सकता हूं कि आप में से अधिकांश प्रश्न को समझ नहीं पाए हैं :) (प्रश्न यह था कि बफर में बाइनरी डेटा को मान्य करने के लिए, डिस्क पर फ़ाइल नहीं)।

मैं एक ही समस्या थी, और साथ इसका समाधान नहीं:

$finfo = new finfo(FILEINFO_MIME_TYPE); 
$finfo->buffer($rawImage); 
+1

यह समाधान सबसे अच्छा है, यदि आप PHP का उपयोग कर रहे हैं> 5.3 – djleop

+0

यह वास्तव में पीएचपी की वर्तमान स्थिति से मेरा ऊपर upvoted किया जाना चाहिए, 5.3 वर्ष हो रही है। – Wrikken

+0

स्ट्रिंग प्रारूप क्या होगा यह वापस आएगा? –

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