2013-06-27 2 views
2

저는 며칠 동안 PHP를 사용하여 다운로드를 시작하는 해결책을 찾고자했습니다. 물론 많은 솔루션을 찾았습니다. 불행히도 그들 중 누구도 나를 위해 일하지 못했습니다. 어떤 이유로 든 테스트를하고 다운로드를 시작하려고하면 원하는 파일이 표시되지만 다운로드 할 파일의 종류에 상관없이 다운로드 할 때 내 웹 사이트의 HTML이 포함 된 텍스트 파일로 다운로드됩니다. .PHP를 사용하여 다운로드를 시작하는 방법

header("Content-Disposition: attachment; filename=\"" . basename($File) . "\""); 
header("Content-Type: application/force-download"); 
header("Content-Length: " . filesize($File)); 
header("Connection: close"); 
+0

헤더가 전송 된 후에 출력되는 내용은 다운로드 한 파일의 일부입니다. 귀하의 사이트가 다운로드 스크립트에서 html을로드하고 있다면 다운로드가 포함됩니다. –

+5

'application/force-download'는 다운로드를 강제하지 않습니다. 'Content-Disposition'은 그것을 처리해야합니다. 아마도 'application/octet-stream'과 같은 유효한 content-type을 원할 것입니다. –

답변

3

당신이 이것을 시도하십시오 수 : 여기

내가 시도하는 많은 사례 중 하나의 예입니다? readfile() 기능이 필요합니다. 오히려, PHP로 파일을 제공 x-sendfile 헤더 서버에 넘겨하는 것보다

<?php 
    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'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
?> 
+0

참고'ob_clean()'과'flush()'는 다운로드를 시작하기 전에 버퍼가 비어 있는지 확인하고, 다운로드를 시작하기 전에 다른 내용이 출력되지 않았는지 확인하십시오. 특히 빈 줄을보십시오. –

+0

대단히 Ozkan Ozlu, 완벽하게 작동 해 주셔서 감사합니다. :디. 당신은 매우 도움이되어 매우 감사드립니다. – user2529964

+0

버퍼가 초기화되지 않았다면'ob_flush()'는 Warning을 출력 할 수 있습니다.'flush()'는 아무것도 보장하지 않습니다. 프로젝트의 디자인과 관련하여 그 목적이 확실하지 않으면 파일을 보내기 위해 이러한 함수 중 하나를 호출해야한다고 생각하지 않습니다. – Havenard

1

. 성능은 훨씬 뛰어납니다 (특히 큰 파일의 경우). 서버가 필요한 응답 헤더를 처리합니다.

Apache mod이 있으며 Lighttpd와 Nginx (약간 다른 이름이 있음)에 내장되어 있습니다.

관련 문제