2017-12-12 9 views
0

ziparchive를 사용하여 일부 파일의 zip을 만든 다음 다음 코드를 사용하여 파일을 다운로드해야합니다.zip 아카이브를 사용하여 PHP에서 유효한 zip 파일을 만들 수 없습니까?

if(count($valid_files > 0)){ 
    $zip = new ZipArchive(); 
    $zip_name = "pixels.zip"; 
    if($zip->open($zip_name, ZIPARCHIVE::CREATE)!==TRUE){ 
     $error .= "* Sorry ZIP creation failed at this time"; 
    } 

    foreach($valid_files as $file){ 
     $zip->addFile($file); 
    } 

    $zip->close(); 
    if(file_exists($zip_name)){ 
     // force to download the zip 
     header("Pragma: public"); 
     header("Expires: 0"); 
     header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
     header("Cache-Control: private",false); 
     header('Content-type: application/zip'); 
     header('Content-Disposition: attachment; filename="'.$zip_name.'"'); 
     ob_clean(); 
     flush(); 
     readfile($zip_name); 
    //remove zip file from temp path 
     unlink($zip_name); 
    } 

} else { 
    echo "No valid files to zip"; 
    exit; 
} 

$valid_files 완전한 파일 경로 각 요소 배열을 포함한다고 가정. 위의 코드는 파일을 포함하는 zip 파일을 생성 할 것으로 예상되지만 반대로 다운로드가 시작되면 마무리 크기 나 최대 크기없이 다운로드가 계속됩니다. 그리고 어떤 경우에는 파일이 다운로드 되더라도 파일을 압축 해제하려고 시도 할 때 잘못된 파일로 오류가 발생합니다. 문제를 이해할 수 없으면 어떤 도움도 크게 받으실 수 있습니다.

+0

'$ error'에는 아무것도 포함되어 있지 않으십니까? – Jaime

+0

때로는 파일이 적어도 다운로드되는 경우가 있습니까? 'unlink' 파일을 삭제하고 두 파일을 비교하면 어떻게됩니까? 그들은 같은가요? 서버 측 파일을 압축 해제 할 수 있습니까? 귀하의 발췌 문장은 나를 위해 okish 작동하는 것 같습니다. – delf

+0

브라우저에서 header ("Content-length : $ size")와 같은 헤더를 추가하면 예상대로 진행률 막대가 표시됩니다. –

답변

0

큰 이유는 거대한 zip 파일이 이미 새 zip을 생성하는 데 사용 된 zip 이름과 같은 폴더에 존재했기 때문입니다. 새로운 zip이 작성되지 않았고이 오래된 거대한 zip이 시작되었습니다. 다운로드하고 Marcelo의 의견에서 언급 한 바와 같이 크기가 언급되지 않았기 때문에 다운로드가 성공하지 못했지만 바이너리가 크기를 언급하고 zip 이름을 변경했거나 이전 zip 파일을 삭제 한 것으로 선언 된 인코딩에서 일할 수있었습니다.