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

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!
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 로
받는식으로 구현은 해놔서
너무 무리 안해주셔도 되요.

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

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

회원로그인

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