ZipArchive를 이용한 ZIP 생성후 다운받을때 문제
본문
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=".$zip_name);
header("Pragma: no-cache");
header("Expires: 0");
readfile($zip_name);
unlink($zip_name);
------------------------------------------------
unlink 를 하지않았을때
정상적으로 웹서버 테스트 폴더에
zip 파일이 정상적으로 생성된걸 확인했고
다운받아지는 파일은 "폴더를 열수없습니다. ~~~ (가) 올바르지 않습니다" 라며
잘못된 형식으로 받아집니다.
차선책으로
자바스크립트로 정상적으로 생성된 임시파일을 다운받고
ajax로 임시파일 삭제하는 php를 호출해서 임시zip파일을 삭제하려고 합니다.
그런데 궁금한게 위 header 구문이나
readfile 할때 문제같은데 잘못된게있을까요?
느낌적인느낌이지만 다운로드할때 zip파일은
ZipArchive로 생성된 파일을 가져오지 못하는것같습니다.
다운로드는 되지만 다운로드된 파일은 ZipArchive 로 생성한 파일이 아니더라구요.
PHP버전은 5.6 입니다
답변 3
readfile 과 unlink 시에는 실저장 경로+파일명을 지정해야 하는데
$zip_name 으로 파일명만 지정한 것은 아닌가요?
if (file_exists($zipName))
{
if (FALSE!== ($handler = fopen($zipName, 'r')))
{
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($zipName));
header('Content-Transfer-Encoding: chunked'); //changed to chunked
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
//Send the content in chunks
while(false !== ($chunk = fread($handler,4096)))
{
echo $chunk;
}
}
exit;
}
파일이 메모리 보다 커서 파일이 짤릴 수 있습니다. 이렇게 수정해서 블럭단위로 처리해 보십시요
!-->
$file = '/path/to/file';
$maxRead = 1 * 1024 * 1024; // 1MB
$fileName = 'download_file.txt';
$fh = fopen($file, 'r');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
while (!feof($fh)) {
echo fread($fh, $maxRead);
ob_flush();
}
exit;
이걸로 테스트해 보십시요.
!-->