2009-12-05 17 views
55

में एक छवि मैं एक छवि $file (जैसे ../image.jpg)आउटपुट पीएचपी

जो एक माइम प्रकार $type

है कैसे कर सकते हैं मैं इसे ब्राउज़र को आउटपुट?

उत्तर

107
$file = '../image.jpg'; 
$type = 'image/jpeg'; 
header('Content-Type:'.$type); 
header('Content-Length: ' . filesize($file)); 
readfile($file); 
+13

PHP और/या सर्वर आपके लिए सामग्री-लंबाई का ख्याल रखेगा। –

+1

सुविधा के लिए सामग्री लंबाई शीर्षलेख। –

+2

किसी भी कारण से फ़ाइल को पूर्ण पथ से छवि तक पहुंचने का प्रयास करते समय मेरे लिए विफल रहा, इसलिए मैंने उस पंक्ति पर टिप्पणी की और कोड ठीक काम कर रहा है। – kiranvj

0
<?php 

header("Content-Type: $type"); 
readfile($file); 

यह छोटा संस्करण है। चीजों को अच्छे बनाने के लिए आप कुछ अतिरिक्त छोटी चीजें कर सकते हैं, लेकिन यह आपके लिए काम करेगा।

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

और readfile उत्पादन के लिए छवि की सामग्री:

readfile($file); 


और शायद

3
header('Content-type: image/jpeg'); 
readfile($image); 
0

आप सही सामग्री प्रकार भेजने के लिए उपयोग कर सकते हैं header(शायद नहीं cessary, लेकिन, बस मामले में) आप सामग्री-लंबाई हेडर भी भेज करना होगा:

header('Content-Length: ' . filesize($file)); 


नोट: यदि आप और नहीं उत्पादन कुछ भी अपनी छवि डेटा से यह सुनिश्चित कर लें (कोई सफेद अंतरिक्ष, उदाहरण के लिए), या यह अब मान्य छवि नहीं होगी।

3

इस प्रयास करें:

<?php 
    header("Content-type: image/jpeg"); 
    readfile("/path/to/image.jpg"); 
    exit(0); 
?> 
29

आप अपने वेब सर्वर अपने आप को, mod_xsendfile की तरह (अपाचे के लिए) उपकरण काफी पढ़ने और PHP में फ़ाइल मुद्रण से बेहतर हैं कॉन्फ़िगर करने के लिए स्वतंत्रता है। आपका PHP कोड इस प्रकार दिखाई देगा:

header("Content-type: $type"); 
header("X-Sendfile: $file"); # make sure $file is the full path, not relative 
exit(); 

mod_xsendfile एक्स Sendfile हैडर ऊपर उठाता है और ब्राउज़र में ही करने के लिए फ़ाइल भेजता है। यह विशेष रूप से बड़ी फ़ाइलों के लिए प्रदर्शन में वास्तविक अंतर डाल सकता है। अधिकांश प्रस्तावित समाधान पूरी फ़ाइल को स्मृति में पढ़ते हैं और फिर इसे प्रिंट करते हैं। यह 20kbyte छवि फ़ाइल के लिए ठीक है, लेकिन यदि आपके पास 200 MByte TIFF फ़ाइल है, तो आपको समस्याएं मिलती हैं।

+0

की एक दिलचस्प टिप्पणी हुई, मुझे वास्तव में क्या चाहिए! – Ian

20
$file = '../image.jpg'; 

if (file_exists($file)) 
{ 
    $size = getimagesize($file); 

    $fp = fopen($file, 'rb'); 

    if ($size and $fp) 
    { 
     // Optional never cache 
    // header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); 
    // header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past 
    // header('Pragma: no-cache'); 

     // Optional cache if not changed 
    // header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($file)).' GMT'); 

     // Optional send not modified 
    // if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) and 
    //  filemtime($file) == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) 
    // { 
    //  header('HTTP/1.1 304 Not Modified'); 
    // } 

     header('Content-Type: '.$size['mime']); 
     header('Content-Length: '.filesize($file)); 

     fpassthru($fp); 

     exit; 
    } 
} 

http://php.net/manual/en/function.fpassthru.php

+0

में पढ़ने के कारण गड़बड़ी – rinchik

+0

'$ आकार ['माइम']' ?? – Michael

+0

@ माइकल [php.net के माध्यम से] (http://php.net/manual/de/function.getimagesize.php) _ getimagesize() फ़ंक्शन किसी दिए गए छवि फ़ाइल का आकार निर्धारित करेगा और साथ आयामों को वापस करेगा सामान्य HTML IMG टैग और संवाददाता HTTP सामग्री type._ के अंदर फ़ाइल प्रकार और ऊंचाई/चौड़ाई टेक्स्ट स्ट्रिंग का उपयोग किया जाना चाहिए – Pixelkrieg

0

आप finfo (PHP 5.3+) का उपयोग सही MIME प्रकार प्राप्त करने के लिए कर सकते हैं।

$filePath = 'YOUR_FILE.XYZ'; 
$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$contentType = finfo_file($finfo, $filePath); 
finfo_close($finfo); 

header('Content-Type: ' . $contentType); 
readfile($filePath); 

पुनश्च: आप Content-Length निर्दिष्ट करने के लिए की जरूरत नहीं है, अपाचे यह तुम्हारे लिए क्या करेंगे।

0
$file = '../image.jpg'; 
    $type = 'image/jpeg'; 
    header('Content-Type:'.$type); 
    header('Content-Length: ' . filesize($file)); 
    $img = file_get_contents($file); 
    echo $img; 

यह मेरे लिए काम करता है! मैंने कोड इग्निटर पर इसका परीक्षण किया है। अगर मैं रीडफाइल का उपयोग करता हूं, तो छवि प्रदर्शित नहीं होगी। कभी-कभी केवल jpg प्रदर्शित करते हैं, कभी-कभी केवल बड़ी फ़ाइल। लेकिन जब मैंने इसे "file_get_contents" में बदल दिया, तो मुझे स्वाद मिलता है, और काम करता है !! यह स्क्रीनशूट है: Screenshot of "secure image" from database