2010-01-08 6 views
14

PHP의 브라우저에 기존 파일을 제공하고 싶습니다. image/jpeg에 대한 예제를 보았습니다.하지만이 함수는 파일을 디스크에 저장하는 것으로 보입니다. 올바른 크기의 이미지 객체를 먼저 만들어야합니다. 그렇지 않으면 이해할 수 없습니다.)브라우저에서 디스크의 PHP 출력 파일

asp. net 바이트 배열의 파일을 읽은 다음 context.Response.BinaryWrite (bytearray)를 호출하여 PHP에서 비슷한 것을 찾고 있으므로이 작업을 수행합니다.

미셸

답변

26

정확히 당신이 필요로 어떻게해야 fpassthru()있다 (헤더를 사용하는 일반적인 보안 고려 사항() 적용). 다음의 예에 대해 읽고 설명서 항목을 참조하십시오 :

<?php 

// open the file in a binary mode 
$name = './img/ok.png'; 
$fp = fopen($name, 'rb'); 

// send the right headers 
header("Content-Type: image/png"); 
header("Content-Length: " . filesize($name)); 

// dump the picture and stop the script 
fpassthru($fp); 
exit; 

?> 

은 PHP의 파일 시스템의 모든 기능에 대한 here를 참조하십시오.

다운로드 용으로 제공하려는 이진 파일 인 경우 올바른 헤더를 보내어 "다른 이름으로 저장"대화 상자가 나타나기를 원할 수도 있습니다. 보낼 헤더에 대한 좋은 예는 this question의 첫 번째 대답을 참조하십시오.

+1

바이너리 컨텐트를 이미 변수로 저장 한 경우 어떻게됩니까? 다운로드 가능한 파일로 브라우저에 어떻게 출력합니까? – CMCDragonkai

2

이것은 당신이 시작할 수 있어야합니다 http://de.php.net/manual/en/function.readfile.php

편집 : 웹 서버를 사용하여 지원하는 경우

파일 이름이

/var/www/www.example.org/downloads/example.zip 
같은 로컬 경로를 포함
header('X-Sendfile: ' . $filename); 

은 readfile()보다 빠릅니다.

+0

하나를 사용합니다. – Christian

1

나는 클라이언트를 위해 만든 웹 사이트와 웹 사이트에서 오랜 시간 전에 발견 한 PHP 스크립트를 사용합니다. 나는 나뿐만 아니라 (기본값)하는 핫 링크 (기본값)를 허용하지를 파일 시스템 구조를 당황하게 할 수 있도록 그것의 약간 수정 된 버전을 사용 http://www.zubrag.com/scripts/download.php

과 :

은 여기에서 찾을 수 있습니다 리퍼러, IP (기본값) 및 기타 필요한 데이터가 필요할 때 추가 기능을 추가했습니다.

희망이 도움이됩니다.

+0

스크립트를 제공해 주셔서 감사합니다. 첫 번째 스크립트를 확장하고 싶다면 확실히 사용할 것입니다. – Michel

2

나는 ReadFile을 사용() (http://www.php.net/readfile) ...

그러나 당신은 당신이 헤더 권리 "의 Content-Type"로 설정해야합니다()을해야하므로 브라우저는 파일과 함께 무엇을 알고있다.

플러그인을 사용하여 파일을 표시하는 대신 브라우저에서 강제로 파일을 다운로드하도록 할 수도 있습니다 (예 : PDF).이 파일은 "해킹"으로 보일 수 있지만, 위의 링크.

9

나는`X-Sendfile`이

if (file_exists($file)) { 


     header('Content-Description: File Transfer'); 
     header('Content-Type: application/octet-stream'); 
     header('Content-Disposition: attachment; filename='.basename($file)); 
     header('Content-Transfer-Encoding: binary'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($file)); 

     ob_clean(); 
     flush(); 
     readfile($file); 
     exit; 

    }