글쓰기 / 관리자
헤니l
헤니의 개발 공부
헤니l
전체 방문자
오늘
어제
  • 분류 전체보기 (100)
    • study (46)
      • JAVA (5)
      • PHP (24)
      • JS , jQuery (7)
      • 서버 (1)
      • 코딩테스트 (9)
    • 회사일기 (1)
    • 취준 (2)
    • 인천일보아카데미 교육과정 (51)
      • 인천일보아카데미 (51)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • HTML공부
  • JS
  • php계층형게시판
  • 날씨어플만들기
  • 코딩공부
  • CSS
  • HTML
  • 비전공자개발공부
  • 자바스크립트
  • php게시판
  • 비전공코딩공부
  • 비전공개발자
  • php게시판리스트
  • 코딩
  • 게시판구현
  • 인천일보아카데미
  • PHP
  • 비전공개발공부
  • php회원가입
  • 개발공부

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
헤니l

헤니의 개발 공부

study/PHP

zip 알집파일 다운로드, 에러

2023. 12. 8. 15:47

 

php에서 zip압축파일을 다운받으려면 zip아카이브를 사용하면 되는데 

예시 코드는 정말 간단하다 ! 구현은 금방 했는데 에러 해결하는데(삽질) 며칠이나 걸렸다 휴 .. 

 

 

 

먼저 전체코드

<?php
$no = $_GET['no'];
$fileType = $_GET['fileType'];
$path = PATH_DATA."/directory/";

//zip생성
$zip = new ZipArchive();
// zip 아카이브 생성하기 위한 고유값
$zipName = $path. time().".zip";

$sql ="SELECT * FROM table WHERE no = '{$no}'";
$rst = $this->db->getArray($sql);

foreach ($rst AS $val){
    $name = $val['name'];
    if($fileType === '1') {
        //다운로드될 zip파일명
        $zipFileName = $name ."_resume.zip";
        //압축할 파일경로,파일명
        $fileZip = array(
            $val['upfile1'],
            $val['upfile2'],
            $val['upfile3'],
            $val['upfile4'],
            $val['upfile5'],
        );
    }else{
        $zipFileName = $name ."_portfolio.zip";
        $fileZip = array(
            $val['upfile6'],
            $val['upfile7'],
            $val['upfile8'],
            $val['upfile9'],
            $val['upfile10'],
        );
    }
}
//빈값 제거
$fileZip = array_filter($fileZip);

// zip 아카이브 생성 여부 확인
if (!$zip->open($zipName, ZipArchive::CREATE)) {
    exit("error");
}

// 각 파일을 Zip 아카이브에 추가(파일경로, 저장될 이름)
foreach ($fileZip as $file) {
    if (file_exists($path.$file)) {
        $zip->addFile($path.$file, $file);
    } else {
        echo " $file 이 없습니다.";
    }
}
$zip->close();

// 생성한 zip 파일을 다운로드하기
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=$zipFileName");
ob_clean();
flush();
readfile($zipName);
unlink($zipName);
?>

 

 

zip아카이브 생성 후 생성여부 확인,

압축해야하는 각 파일을 아카이브에 addFile()을 통해 추가해준다 

$zip->close() 까지 ! 하고 

 

readFile을 통해 파일읽고 

unlink로 서버에 만들어진 zip 삭제 

 

 


까지 간단한 코드지만 중간에 좀 추가된 코드, 에러를 정리해보자!

 

 

 

- 1번 사용자에게는 1타입의 파일 5개와 2타입의 파일 5개까지 저장된다 (각 1개일수도, 5개일수도 있음)

- 각 타입의 버튼이 있고 버튼 클릭시 해당 파일 ?/5 가 알집파일로 다운로드!

 

$sql ="SELECT * FROM table WHERE no = '{$no}'";
$rst = $this->db->getArray($sql);

foreach ($rst AS $val){
    $name = $val['name'];
    if($fileType === '1') {
        //다운로드될 zip파일명
        $zipFileName = $name ."_resume.zip";
        //압축할 파일경로,파일명
        $fileZip = array(
            $val['upfile1'],
            $val['upfile2'],
            $val['upfile3'],
            $val['upfile4'],
            $val['upfile5'],
      }
}

 

다운로드될 zip 파일명을 정해주고 

$filezip에 db에 있는 파일을 담아준다

 

 

// 각 파일을 Zip 아카이브에 추가(파일경로, 저장될 이름)
foreach ($fileZip as $file) {
    if (file_exists($path.$file)) {
        $zip->addFile($path.$file, $file);
    } else {
        echo " $file 이 없습니다.";
    }
}
$zip-

 

파일들을 각각 addFile로 추가해준다 

 

삽질포인트 1 

경로 확인 잘 하기!!! 경로 때문에 한참 고생했다.. 

 

 

삽질포인트2 

$fileZip = array_filter($fileZip);

 

아무리 해도 add가 잘 안되는 거 ..

경로도 맞고 header도 잘 들어가있고 php버전도 맞는데 왜 !!!! 

 

filezip에 빈값도 담겨있는데 그 빈값을 걸러내는 게 아니라 안되는 거 같아서 

추가하기 전에 빈값을 제거해줬다

 

 

 

 

이렇게하니까 로컬에서는 정상적으로 zip파일이 다운이 돼서 배포를 했는데 ... 

아니 왜 또 안돼요 ... 

 

 

 

 

삽질포인트3

 

다운은 잘 되는데 다운로드된 파일이 압축파일이 아닌 거 같다나 뭐라나 .. 

 

파일위치의 경로도 똑같고 

디렉토리, 파일의 권한도 똑같은데 안되길래 

로컬이랑,운영서버에서의 권한이 똑같더라도 전체권한은 아니라 안될수도 있지 않을까 싶어서

전체권한으로 수정해봤는데도 안됨 

 

header에 size부분을 주석 걸었다 풀면 오류가 다르게 나타나서 

size문제인가 싶어서 계속 삽질했다 .. 

 

zip찍어보면 파일이 정상적으로 들어가있는데 왜 안열릴까 .. 

다운로드 된 파일을 메모장으로 열었더니 readfile($zipName); 이 자꾸 없대 ..

 

다운받아야 할 파일은 잘 있는데 왜그러냐  싶었는데 
로컬에서는 unlink주석걸고 보니까 zipname파일이 만들어지는데 
라이브에서는 안만들어짐 if(open) 에서 아카이브생성여부 확인할때  에러가 안나는데 왜냐고 ~~~~ 

 

그래서 경로는 문제가 아닐거라생각해 한참을 삽질했다 .. 

 

 

하다가 결국 경로를 확실하게 다시 보자는 마음에 

$zipName = time().".zip"; 

$zipName = $path. time().".zip"; 

 

zip파일 만들어줄때 경로 추가해주니까 이제서야 되더라 .. 

길고 길었다 ..

 

아 filesize도 로컬에서는 문제 없는데 운영서버에서는 size관련된 게 있으면 에러나서

그냥 빼버렸다 !! 


 

 

오류날때는 

 

권한, 경로 꼭 꼭 잘 확인해보기 !!!!!! 

 

    'study/PHP' 카테고리의 다른 글
    • [PHP] 달력 만들기, 검색
    • [PHP] 파일 업로드 (디렉토리, 파일명 변경), 다운로드
    • 특정 아이피로 접근 구분하기
    • 엑셀파일 생성하기(한글 깨질때), 엑셀 다운로드
    헤니l
    헤니l

    티스토리툴바