2012-02-19 4 views
2

브라우저에서 다운로드해야하는 파일을 열지 않도록 강제 다운로드 페이지를 만들려고합니다. 문제는 다운로드 한 파일이 0 바이트이므로 사용할 수 없다는 것입니다. 내 코드에 어떤 문제가 있습니까?강제로 PHP에서 다운로드

$file = "http://gh0stsec.zxq.net/background1.jpg"; 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: application/force-download"); 
header("Content-Disposition: attachment; filename=".basename($file)); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: ".filesize($filename)); 
header("Content-Description: File Transfer"); 
@readfile($file); 
exit(); 
+0

'application/force-download'는 실제 MIME 형식이 아닙니다. 그것은 지체됐다. 그것이 다운로드를 유발하는 것이 아닙니다. 그것은'Content-Dispositon'입니다. 유효하지 않은 MIME 유형을 추가하는 것은 의미가 없습니다. – mario

답변

3

검사 :

header("Content-Length: ".filesize($filename)); 

나는 그것이해야한다고 생각 :

header("Content-Length: ".filesize($file)); 
+0

감사합니다. 바로 해결했습니다. 나는 내가 어떻게 그것을 간과하는지 전혀 모른다. –

1

내가 그것을 (로컬 파일이 아닌 이후 당신이 filesize에 문제가있는 것 같아요 그 경우 , 상대 경로 사용). Content-Type 헤더는 항상 나에게 조금 이상하지만, 내가 읽은 모든 예에서, force-download은 항상 후퇴했습니다. 어쨌든, 나는 이것을했고 그것이 작동하는 것처럼 보였다. :

<?php 
$file = file_get_contents('http://gh0stsec.zxq.net/background1.jpg'); 

if ($file) 
{ 

    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename=background1.jpg'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . strlen($file)); 
    ob_clean(); 
    flush(); 

    echo $file; 
} 
else 
{ 
    echo 'error'; 
} 
?> 
관련 문제