[PHP] 다중 파일을 zip으로 묶어받기

Posted at 2014. 3. 16. 15:29 | Posted in 프로그래밍

php로 여러 개의 파일을 묶는 방법은 여러가지가 있다. exec()으로 압축 프로그램을 실행시켜서 묶거나 , ZipArchive로 묶거나, 직접 묶거나. 이 글은 다 묶어질 때까지 기다릴 필요가 없는 직접 묶는 방법으로 코딩한 소스를 공유하고자 작성하였다!

소스와 사용법

PKZip의 구조를 정리해놓은 문서PHP ZipArchive 클래스를 참고해서 직접 코딩했다. 이 소스는 zip 관리용이 아니라 묶어받기용이다.

php 5.3 이상의 환경에서 위와 같이 코딩하면 한 주소에서 파일 여러 개를 묶어서 내려받을 수 있다.

단점

다 묶일 때까지 기다리거나 임시파일 만들 필요가 없는 이 소스에도 단점이 있다. 파일 이어받기가 안 되고 언제 다 받을지 모른다는 것인데, 다 받아질 때까지 느긋하게 기다리라고 클라이언트에 알려두면 좋을 것 같다.

최대한 간단하게 코딩해서 그런지 파일의 만든 날짜, 엑세스한 날짜 등이 지워진다는 것을 단점이라고 해야 되나 모르겠다. 난 좋은데.

  1. 이전 댓글 더보기
  2. 테러보이
    2014.11.12 19:33
    좋은 소스 감사합니다.
    실례가 되지 않는다면 http://blog.terrorboy.net 으로 스크랩 해가도 될까요?
    문론, 내용 하단에 원본 출처를 남긴다는 조건으로요^^
  3. 비틀즈
    2015.04.02 17:26
    좋은소스로 제대로 작업했어요 감사합니다.
    너무 좋은 소스 담아갈께요~~~~
  4. OMG
    2015.05.14 11:18
    감사합니다
    잘 만드셨네요^^
  5. 꽁냥
    2015.08.05 17:14
    올려놓으신 소스 참고해서 처리했습니다..
    좋은내용 감사합니다^^
  6. 질문
    2016.01.01 21:29
    윈도우 7에스는 작동 되나요.?
  7. 2016.03.04 16:48 신고
    압축 다운이 되고 압축 해제해봤습니다
    문제는 압축하일에서 addFile 함수로 보낸 파일이 압축파일내로 안들어가집니다
    $zip->open('아리아워크룸(신경욱).zip');
    $zip->addEmptyDir('아리아워크룸(신경욱)');
    $zip->addFile('/attach/20160215/1455506575.jpg', '아리아워크룸(신경욱)/1.jpg');
    $zip->addFromString('아리아워크룸(신경욱)/바로 글쓰기.txt', '파일 내용');
    이렇게 넣었는데요
    텍스트파일은 압축해제하니 저대로 뜹니다
    폴더도 생성되고요
    이미지파일만 생성이 안되는데 이유가 뭘까요?
    1455506575.jpg 파일은 실제 웹 서버에 올라가 있는 파일입니다
  8. 2016.03.04 16:51 신고
    압축 다운이 되고 압축 해제해봤습니다
    문제는 압축하일에서 addFile 함수로 보낸 파일이 압축파일내로 안들어가집니다

    텍스트파일은 압축해제하니 제대로 뜹니다
    폴더도 생성되고요
    이미지파일만 생성이 안되는데 이유가 뭘까요?
    파일은 실제 웹 서버에 올라가 있는 파일로 경로 설정도 root를 / 로 시작했습니다
    • 2016.03.25 20:06 신고 [수정/삭제]
      대상 파일의 경로를 잘 확인해야 합니다.
      www
      -.php
      -attach
      --20160215
      ---1455506575.jpg
      폴더 구성이 이렇게 돼있다면 '/attach'에서 '/'를 빼야 합니다.
      추가로, ftp에서 볼 때 root와 웹서버의 root는 같지 않을 수 있으므로 조심하세요.
  9. 질문
    2016.11.15 11:26
    질문이있습니다 위에서 170번째줄 변경하라고 하셨는데 어디를 변경하면 되는건지 도통..모르겠습니다
    저도 알집과 윈집에서 파일열기 및 압축해제에서 손상된 파일이라는 오류메세지가 나타납니다.
  10. 질문
    2017.04.19 18:37
    소스를 받아 잘 사용하고 있습니다. 이번에 서버를 변경하며 5.5.9 버전이 되었습니다.
    다운로드는 되는것 같은데 알집에서 헤더가 손상되었다고 나옵니다. 파일은 잘들어 오는것 같습니다,.
  11. KJM
    2017.10.26 13:02
    좋은 소스 감사합니다.
    보내주신 소스로 만들어보니 파일 압축과 다운은 잘되는데 다운받은 압축파일을 열어보면 압축되어진 이미지 파일들의 크기가 0으로 나오고 있습니다. 이미지는 당연히 비어있구요ㅠㅠ 내용이 왜 안들어가지는지 알수 있을까요?
  12. KJM
    2017.10.27 15:13
    서버 환경입니다.
    EUC-KR (PHP5.2, MySQL5.x)
    • 2017.10.30 08:37 신고 [수정/삭제]
      일단 PHP 버전이 권장버전보다 낮네요..
      소스코드에 골뱅이(@)를 다 지워보시고 출력되는 에러 로그를 첨부해주실레요?
      제일 의심가는 게 BUFFER_SIZE const 선언부이긴 한데, BUFFER_SIZE 값을 75번째 줄에 바로 입력하는 거도 고려해주세요.
  13. kws
    2018.01.03 18:01
    멀티로 이미지를 압축해서 받을려구 하는데 압축하고 받는것 까지는 해결 되었는데
    문제는 이미지를 열 수가 없습니다 ㅜㅜ 왜 안열리는 지 알 수 있을까요 ㅜㅜ
  14. 타이판
    2018.07.12 15:53
    zip->close후에 추가 동작 넣을 수 없나요? 새로고침이라던가 창 닫기라던가.. 하는것들이요. ㅠㅠ
    • 2018.07.13 15:07 신고 [수정/삭제]
      해당 페이지로 연결되는 a 태그의 속성에 download 를 추가하면 빈 페이지가 표시되지는 않을 겁니다.
      아니면 a 태그에 target="_blank" 속성을 추가하면 해결될 수도 있어요.
      페이지가 어떻게 보이시기에 그러시는지요??
  15. 차봉남
    2018.08.16 14:54
    감사합니다. 유용하게 잘 사용하겠습니다.
  16. zpfmal
    2018.11.12 18:45
    ftp서버에 있는 파일도 묶을수가 있나요?

    파일을 묶어놓고 받을지 말지 선택하려고 합니다
    • 2018.11.14 11:10 신고 [수정/삭제]
      ftp는 ftp://계정이름:비밀번호@서버주소/파일경로 로 파일을 추가하시면 됩니다.
      예시 코드는 아래와 같습니다.

      $zip->addFile('ftp://계정이름:비밀번호@서버주소/추가할 파일.jpg', '압축파일 내 파일 이름.jpg');

      ftp 서버에 익명 접근이 가능하다면 ftp://서버주소/파일경로 로 추가하시고,
      계정에 비밀번호가 없으면 ftp://계정이름@서버주소/파일경로 로 추가하시면 됩니다.
  17. 도움감사여
    2018.12.11 17:17
    안녕하세요
    소스코드를 보고 많은 도움을 받았습니다. 감사합니다.
    다름이 아니라 압축을 하면 한글 파일명은 깨져서 나오는데 어떤 조치를 취해야할지 알수 있을까요?
  18. kevin
    2019.07.23 10:37
    혹시 $zip->close()하고 나서 라던지 아님 $zip->addFile 을 호출하는 루프문 끝에서 zip 파일 전체크기를 알수 있나요?
    • 2019.07.26 13:49 신고 [수정/삭제]
      https://blog.bloodcat.com/277#file-cla_directzip-php-L96
      96번째 줄을 아래처럼 바꿔주세요.

      ob_start();

      https://blog.bloodcat.com/277#file-cla_directzip-php-L105
      105번째 줄을 아래처럼 바꿔주세요.

      $this->currentOffset += $length + strlen(ob_get_flush());

      그러면 close() 후에 currentOffset 값이 zip 파일의 크기가 됩니다.
  19. mint
    2019.07.30 16:47
    안녕하세요 코드보고 적용하니까 잘 작동하네요! 감사합니다. (php7버전사용중)
    궁금한 점이 있어 댓글 달아요.
    이미지 파일을 묶어서 다운받는 작업을 하고있는데
    이미지 50개 정도는 zip으로 잘 받아지는데 이미지 개수가 50개가 조금 넘으면 다운로드 시 압축이 제대로 안되네욥..
    혹시 이미지용량 커서 그런건지.. 해결방법이 있을까요?!
  20. 2020.08.31 12:30
    덕분에 시간절약했습니다.
    감사해서 댓글 남겨요
  21. 2020.09.18 15:03
    안녕하세요 위에 올려주신걸로 압축해서 다운하는걸 만들었는데요.. 웹은 잘되는데 아이폰에서는 다운이 안되더라구요.. (다운로드페이지.php를 다운받겠냐고 물어봐요..)혹시 아시는거있으시면 알려주실수있을까요..?
    • 2020.09.19 02:02 신고 [수정/삭제]
      웹 브라우저별 Content-Disposition: filename 처리 실태와 절충안
      https://blog.bloodcat.com/302?category=401834
      이 글 참고해보세요.
      cla_directzip.php 에 17~19번 줄에서 파일 이름을 인코딩하는데, 이걸 아이폰에서 처리하지 못하는가봐요.
      해결하시면서 iOS 버전이랑 사용하신 웹브라우저 남겨주시면 좋겠네요!!

댓글 달기

Name __

Password __

Link (Your Website)

Comment