2009-12-05 8 views
55

의 이미지 내가 가진 이미지 $file (예 ../image.jpg) MIME 타입 $type출력 PHP

있다

어떻게 할 수있는 브라우저로 I 출력?

답변

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을 사용할 수 있습니다 (아마 ne cessary하지만, 단지) 경우에 당신은 너무 Content-Length 헤더를 보낼 필요가 없습니다 것입니다 :

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은 X-Sendfile 헤더를 가져 와서 브라우저 자체에 파일을 보냅니다. 이것은 특히 큰 파일의 경우 성능면에서 큰 차이를 만들 수 있습니다. 제안 된 솔루션의 대부분은 전체 파일을 메모리로 읽어 들인 다음 인쇄합니다. 20kbyte의 이미지 파일은 괜찮습니다.하지만 200MB의 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

'$ 크기 [ 'mime']'??! – Michael

+0

@Michael [via php.net] (http://php.net/manual/de/function.getimagesize.php) _getimagesize() 함수는 주어진 이미지 파일의 크기를 결정하고 함께 치수를 반환합니다. 일반적인 HTML IMG 태그 및 해당 HTTP 내용 유형 내에서 사용할 파일 유형 및 높이/너비 텍스트 문자열 ._ – Pixelkrieg

0

당신이 바로 그 MIME 타입을 얻을 수 finfo (PHP를 5.3+)를 사용할 수 있습니다.

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

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

PS : 당신은 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; 

이것은 저에게 유용합니다! 코드 점화기에서 테스트했습니다. readfile을 사용하면 이미지가 표시되지 않습니다. 때로는 jpg 만 표시 할 수도 있고 때로는 큰 파일 만 표시 할 수도 있습니다. 그러나 "file_get_contents"로 변경 한 후, 나는 맛을 얻고 작동합니다 !! 이것은 스크린 샷입니다 : Screenshot of "secure image" from database