2010-04-13 13 views
29

मैं से छवियों को प्रदर्शित कर रहा हूँ अपने वेब जड़ के बाहर, इस तरह:पीएचपी, हैडर के साथ प्रदर्शन छवि()

header('Content-type:image/png'); 
readfile($fullpath); 

सामग्री प्रकार: image/png क्या मुझे confuses है।

किसी और ने मुझे इस कोड के साथ मदद की, लेकिन मैंने देखा कि सभी छवियां पीएनजी नहीं हैं। कई jpg या gif हैं।
और फिर भी वे सफलतापूर्वक प्रदर्शित होते हैं।

क्या किसी को पता है क्यों?

उत्तर

44

सबसे अच्छा समाधान फ़ाइल में पढ़ा है, फिर तय छवि किस तरह की है और उचित हेडर बाहर भेजने के लिए किया जाएगा

$filename = basename($file); 
$file_extension = strtolower(substr(strrchr($filename,"."),1)); 

switch($file_extension) { 
    case "gif": $ctype="image/gif"; break; 
    case "png": $ctype="image/png"; break; 
    case "jpeg": 
    case "jpg": $ctype="image/jpeg"; break; 
    default: 
} 

header('Content-type: ' . $ctype); 

(नोट: JPG फ़ाइलें के लिए सही सामग्री प्रकार image/jpeg है)

+0

मैं विस्तार को पकड़ने के उदाहरण कोड की सराहना करता हूं। विशिष्ट होने के नाते निश्चित रूप से सर्वोत्तम अभ्यास है। – coffeemonitor

+0

आपका स्वागत है! – paullb

+3

$ ctype getimagesize() – Tobia

2

ब्राउज़र अक्सर छवि प्रकार की मेटा जानकारी को छूकर छवि प्रकार बता सकते हैं। साथ ही, उस शीर्षलेख में एक स्थान होना चाहिए:

header('Content-type: image/png'); 
4

ब्राउज़र उन्हें प्राप्त डेटा के साथ अपना सर्वश्रेष्ठ अनुमान बनाते हैं। यह मार्कअप के लिए काम करता है (जो वेबसाइट अक्सर गलत हो जाती हैं) और अन्य मीडिया सामग्री। एक प्रोग्राम जो फ़ाइल प्राप्त करता है, अक्सर यह पता लगा सकता है कि एमआईएम सामग्री प्रकार के बावजूद इसे प्राप्त किया गया है।

यह ऐसा कुछ नहीं है जिसे आपको भरोसा करना चाहिए। यह अनुशंसा की जाती है कि आप हमेशा सही एमआईएम सामग्री का उपयोग करें।

12

एक छवि का प्रकार निर्धारित करने के लिए बेहतर है। exif_imagetype

यदि आप इस फ़ंक्शन का उपयोग करते हैं, तो आप छवि के वास्तविक एक्सटेंशन को बता सकते हैं।

इस फ़ंक्शन फ़ाइल नाम का विस्तार पूरी तरह से अप्रासंगिक है, जो अच्छा है।

function set-header-content-type($file) 
{ 
    //Number to Content Type 
    $ntct = Array("1" => "image/gif", 
        "2" => "image/jpeg", #Thanks to "Swiss Mister" for noting that 'jpg' mime-type is jpeg. 
        "3" => "image/png", 
        "6" => "image/bmp", 
        "17" => "image/ico"); 

    header('Content-type: ' . $ntct[exif_imagetype($file)]); 
} 

आप the link से अधिक प्रकार के जोड़ सकते हैं।

उम्मीद है कि यह मदद करता है।

0

आप फ़ाइल नाम पता है, लेकिन फ़ाइल विस्तार नहीं जानता कि आप इस समारोह का उपयोग कर सकते हैं:

public function showImage($name) 
    { 

     $types = [ 
      'gif'=> 'image/gif', 
      'png'=> 'image/png', 
      'jpeg'=> 'image/jpeg', 
      'jpg'=> 'image/jpeg', 
     ]; 
     $root_path = '/var/www/my_app'; //use your framework to get this properly .. 
     foreach($types as $type=>$meta){ 
      if(file_exists($root_path .'/uploads/'.$name .'.'. $type)){ 
       header('Content-type: ' . $meta); 
       readfile($root_path .'/uploads/'.$name .'.'. $type); 
       return; 
      } 
     } 
    } 

नोट: JPG फ़ाइलें के लिए सही सामग्री प्रकार image/jpeg है।

2

हालांकि अजीब नाम दिया गया है, तो आप getimagesize() फ़ंक्शन का उपयोग कर सकते हैं। इससे आपको माइम जानकारी भी मिल जाएगी:

Array 
(
    [0] => 295 // width 
    [1] => 295 // height 
    [2] => 3 // http://php.net/manual/en/image.constants.php 
    [3] => width="295" height="295" // width and height as attr's 
    [bits] => 8 
    [mime] => image/png 
) 
संबंधित मुद्दे