ZipArchive를 이용한 ZIP 생성후 다운받을때 문제

ZipArchive를 이용한 ZIP 생성후 다운받을때 문제

QA

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 으로 파일명만 지정한 것은 아닌가요?

도메인포함경로와
$_SERVER['DOCUMENT_ROOT'] 의 경로 둘다 해봤는데 안되네요

readfile 이부분에서 파일 읽어들이는건 맞는거겠죠?
읽어들인걸로
header("Content-Disposition: attachment; filename=$zip_name");
여기서 다운로드하고?
attachment 가 안되는느낌인데...

똑같아요~
근데 파일명에 한글이 들어가있긴한데
readfile 하기전에 파일이 있는지 체크할수있는 방법이 있을까요?
실제로 FTP로 봤을땐 파일이 올라가있긴하거든요

file_exists() 함수로 파일 존재 여부를 확인 가능합니다.
한글명이 포함되어 있는 경우 한글 파일명 때문에 발생하는 문제일 수도 있을 것 같습니다.
영문 파일명으로 변경하고 테스트 해보세요.
정상 다운로드되면 iconv()함수로 적당한 인코딩으로 변경해서 처리하면 될 것 같습니다.

안되네요 ...

if(file_exists($downZipName)){
    //header("Content-type: application/octet-stream");
    header("Content-type: application/zip"); //다운로드 파일형식
    header("Content-Disposition: attachment; filename=$downZipName"); //다운로드 파일명
    header("Pragma: no-cache");
    header("Expires: 0");
    readfile($downZipName);//
}else{
    echo "Not file";
}

파일명은 test.zip 으로 생성되게했고
이렇게 했는데도 똑같네요


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;

이걸로 테스트해 보십시요.

$filePath = $_SERVER['DOCUMENT_ROOT']."/";
    $new_path = $filePath."ziptest/";

    $file = $new_path.$downZipName;
    $maxRead = 1 * 1024 * 1024; // 1MB
    $fileName = $downZipName;
    $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();
    }
이렇게 했는데 형식 맞지않았던것처럼 되네요.

서버 설정이나 용량이 공유되는 쉐어링 호스팅서버의
환경적인 문제는 아니겠죠?...

저도 이것때문에 굉장히 삽질을 많이 했는데
덩달아 고생해주시는것같아서 감사하면서도 죄송하네요....

일단 뭐 해결되면 좋긴하겠지만 차선책으로
ajax > PHP > zip파일경로 리턴 > href 로
받는식으로 구현은 해놔서
너무 무리 안해주셔도 되요.

혹시나 이후에 테스트하시다가 문제를 발견하시거나
알게되시면 공유좀 부탁드려요 ㅠㅠ

답변을 작성하시기 전에 로그인 해주세요.
전체 58
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT