2012-04-03 6 views
0

PHP를 사용하여 폴더에서 파일을 다운로드하기위한 스크립트가 있습니다. 로컬에서 작동하지만 다운로드 중 페이지에서 온라인으로 읽고 인쇄하고 있습니다. 도움을PHP가 다운로드하는 대신 파일을 읽는 중입니다.

if($result && count($result) > 0){ 
    $row = $result[0]; 
    $book = true; 
    $Location = './files/'; 
    $bookLocation = $Location . $row['file_name']; // exampe: report.zip 
    if(file_exists($bookLocation)){ 
     $fileLocation = $bookLocation; 
     $file_size = filesize($fileLocation); 
     echo 'Please wait downloading the file....'; 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/force-download'); 
     header('Content-Disposition: attachment; filename=' . $row['file_name']); 
     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: ' . $file_size); 
     ob_clean(); 
     flush(); 
     readfile($fileLocation); 
     exit;  
    }else{ 
     echo '<h3>Sorry!, file not found...</h3>'; 
    } 
} 

htaccess로 스크립트

RewriteEngine on 

RewriteRule ^$ index.html 
RewriteRule ^index.html$ index.php 

RewriteRule ^([0-9]{1,9})(/)([^/\.]+[^/\.]+)(_+[^/\.]+)(\.html|)/?$ index.php?id=$1&cat=$3 
RewriteRule ^([^/\.]+[^/\.]+)(\.html|)/?$ index.php?page=$1 
RewriteRule ^(.*)(/)([0-9]{1,9})(/)(.*)(\.html|)/?$ index.php?view_file=$3&file=$5 
RewriteRule ^(.*)(/)([0-9]{1,9})(/)(.*)(\.htm)/?$ index.php?download=$3 

RewriteRule ^(author)(/)(.*)(.html)/?$ index.php?user=$1 

감사합니다.

+0

당신이 브라우저를 실행하지 않는로 라인

header('Content-Type: application/force-download'); 

를 교체하려고? – zod

+0

링크가있는 새 파일을 만들려고합니다. 링크가이 파일에 있습니다 .. .. 다음 새 페이지를 실행하고 링크를 클릭하십시오 !! – zod

+0

서버가 결국 헤더를 수정합니까? – evotopid

답변

2

특정 브라우저에서는 해당 특정 파일 형식을 자동으로 다운로드하고 실행할 수 있습니다.

이 경우 "수정"할 방법이 없습니다. 브라우저는 파일을 어떻게 처리할지 결정합니다. 다운로드한다고해도 사용자가 직접 실행하도록 지시했을 수 있습니다.

$file_size = filesize($fileLocation); 
    echo 'Please wait downloading the file....'; 
    header('Content-Description: File Transfer'); 

당신은 echo 문을 제거해야합니다 : 내 이전 댓글이 올바른 동안

큰 편집

, 당신은 당신의 코드에서 중요한 문제가 있습니다. 헤더가 전송되지 않는 등의 문제를 야기 할 수 있습니다. 귀하의 설명을 고려할 때, 나는 이것이 귀하의 문제라고 말하고 싶습니다.

콘텐츠를 보내면 더 많은 헤더를 보낼 수 없습니다.

+0

어쨌든 그것은 작동해야합니다 ** if ** ob_start()가 어딘가에 있습니까? – bububaba

+0

그 에코는 아마도 문제 일 뿐이며, 그는 컨텐츠 유형으로 바이너리를 사용하기 때문에 다른 어떤 것도 아닙니다. – Tei

+0

echo를 제거하고 여전히 작동하지 않습니다 ... :( –

0

fopen wrappers을 사용하는 경우이 기능을 사용하면 URL을 파일 이름으로 사용할 수 있습니다. 파일 이름을 지정하는 방법에 대한 자세한 내용은 fopen()을 참조하십시오. 다양한 래퍼의 기능, 사용법에 대한 정보 및 제공 할 수있는 미리 정의 된 변수에 대한 정보에 대한 링크는 Supported Protocols and Wrappers을 참조하십시오.

나는 당신이 당신의 코드에서 echo 문을 제거해야 기독교가 제안한 것처럼 내가 here

+0

이것이 제가 얻은 것입니다 : "sAUç 371å5 ± Ý : Ýù \t ÛºhëT Vk을가/p

+0

은 htaccess로하지 않고 스크립트를 실행 해보십시오 –

0

에서 발견이 도움이되기를 바랍니다. 그것도 그 후 당신을 위해 작동하지 않는 경우, 현지에서

header('Content-Type: application/octet-stream'); 
관련 문제