2014-06-18 2 views
0

로컬 서버에서 zip 파일을 HD로 다운로드하려고합니다.PHP가 .zip 파일을 잘못 다운로드하고 있습니다.

$zip = new ZipArchive; 
$zip->open($archive, ZipArchive::CREATE); 

$files = scandir($dir); 
unset($files[0], $files[1]); 
foreach ($files as $file) { 
$zip->addFile($dir.'/'.$file); 
} 
$zip->close(); 
$download=$archive; 
header("Content-Disposition: attachment; filename=\"Reports". $stocktake_id. ".zip"); 
header("Pragma: public"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 

이 파일은 다운로드하지만, 그것의 크기가 잘못이며 형식 중 하나를 잘못되었거나 파일이 손상되는 것을 말하고, 제대로 열리지 않습니다됩니다.

+0

데이터를 가져 왔는지 확인 했습니까? $ 파일에있는 내용은 무엇입니까? –

+0

코드는 헤더 만 설정하므로 출력이 실제로 비어 있다고 가정해야합니까? –

+0

로컬 서버에서 확인할 수 있으므로 zip 파일이 올바르게 생성됩니다. 내가 자동으로 다운로드 할 수 있기를 원하는 이유는 서버에서 파일을 가져 오는 방법을 모르는 우리 회사의 덤 - 덤 (dum-dum) 때문입니다. – ArtleMaks

답변

0

콘텐츠 유형 헤더가 누락되었다고 생각합니다. 또한 고객 측에 원시 데이터를 에코 화하는 것을 보지 못합니까? 그리고 디버그 출력이나 파일 자체에없는 내용이 없는지 확인하십시오.

//After you saved your file: 

download_file_to_client($saved_file); 
exit; 

function download_file_to_client($file, $mime = 'application/zip') 
{ 
    $filesize = filesize($file); 
    header('Content-Type: '.$mime.';charset=utf-8'); 
    header('Content-Disposition: attachment;filename="some-filename.zip"'); 
    header('Pragma: no-cache'); 
    header('Expires: 0'); 
    header('Content-Length: ' . $filesize); 
    flush(); // Get the headers out immediately to prevent any delay in some browsers. 

    $fh = fopen($file, "r"); 
    while ($fh && !feof($fh)) 
    { 
     echo fread($fh, 8192); 
    } 
    fclose($fh); 
} 
+0

이것을 시도하면 영원히 반복되는 것처럼 보입니까? 나는 그것이 파일의 크기에 의존하지만 zip 파일은 287kb에 불과하므로 오래 걸리 리라 기대하지 않겠는가? 다운로드 대화 상자가 일반 다운로드와 마찬가지로 팝업되어야합니다. 예? – ArtleMaks

+0

즉, 파일 포인터 $ fh가 올바른 포인터가 아닙니다. var_dump $ fh를 확인하고 리소스 ID인지 확인하십시오. 그렇지 않다면 $ file을 전달하는 방법과 달리 $ file의 경로에 도달 할 수 없다는 것을 의미합니다. 함수에 오류 처리를 추가했습니다. – twicejr

+0

절대 경로를 사용하여 어떤 일이 발생하는지보십시오. – twicejr

관련 문제