2009-09-17 2 views
3

내가 디렉토리에서 압축 파일을 생성하고 HTTP 다운로드를 통해 사용자에게 서비스를 제공하기 위해 다음 코드를 사용하려고 해요로 압축 된 파일을 제공 :작성 및 PHP

// write the file 
file_put_contents($path . "/index.html", $output); 

// zip up the contents 
chdir($path); 
exec("zip -r {$course->name} ./"); 

$filename = "{$course->name}.zip"; 

header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename=' .urlencode($filename)); 
header('Content-Transfer-Encoding: binary'); 

readfile($filename); 

내가 만들 수 있어요 zip 파일이지만 http를 통해 다운로드하는 것은 작동하지 않습니다. ftp 클라이언트를 사용하여 만든 zip 파일을 다운로드하면 Mac의 Stuffit Expander가 파일을 압축 해제합니다. 그러나 http를 통해 다운로드하면 Mac unzipper가 무한 루프를 만듭니다. 제가 말하고자하는 것은 내가 다운로드 한 파일을 course.zip이라고 부르면 파일을 압축 해제하면 course.zip.cpgz가 제공되고 압축을 풀면 course.zip이 다시 제공됩니다.

누구든지 아이디어가 있습니까?

감사합니다.

+2

당신의 MIME 형식을 사용하여 해결하지만, 응용 프로그램/우편 번호를 사용하는 친근 수 있습니다. –

+0

@ 토니 밀러 - 왜 대답하지 않았습니까? 여기에서 문제가 될 수 있습니다. – karim79

+0

php : http : // stackoverflow에서 "on-the-fly 압축 및 스트리밍"수행 방법.com/a/4357904/416630 – Lee

답변

1
  1. 것은 그것에게이 요청 될 때마다 다시 압축하는 것은 좋은 생각이 아니다. ZIP 파일이 이미 존재하지 않는 경우에만 시도하십시오.

  2. 휘발성 파일이거나 압축하여 전송하려는 작은 파일이 하나 뿐인 경우에는 더 간단하고 작고 깨끗한 ob_start('ob_gzhandler')을 사용해보십시오. 파일은 압축되어 전송되지만 클라이언트 측에서 원래 형식으로 저장합니다.

  3. Content-Length 헤더를 지정하면 다운로더가 파일의 끝을 알 수 있으므로 진행 제어, 파일 손상 감지 및 HTTP 세션의 중단 방지 (Connection이 Keep- Alive 모드), 아마도이 헤더의 부족은 문제의 근원입니다.

+0

지금도 Content-Length 헤더를 지정 중이며 여전히 작동하지 않습니다. 필자는 근본적으로 사용자에게 약 15 개의 작은 파일을 한꺼번에 제공하려고 시도하고 있으며 압축은 내 유일한 옵션이라고 생각했습니다. 그것에 대해 할 수있는 또 다른 방법이 있습니까? –

1

karim79에서 제안한 내용에 따라 답변을 드리겠습니다. application/octet-stream에서 application/zip으로 MIME 유형을 변경하면 어떻게됩니까?

또한 명령 줄 우편 프로그램을 사용하고 있지만 우편 번호가 성공했는지 확인하지 않고 파일이 최종 사용자에게 발송되기 전에 존재하는지 확인하지 않습니다. 브라우저. 올바른 zip 파일을 보장하기 위해 zip을 사용하여 수동으로 파일 이름을 코딩 한 다음 코드가 브라우저에 제대로 침투하는지 확인하십시오.

+1

Ok MIME 형식을 application/zip으로 변경하고 zip 파일을 하드 코딩하는 방법을 시도했습니다. 올바른 형식 인 것으로 알고 있습니다 (내 컴퓨터와 서버 모두에서 성공적으로 압축이 풀린 파일 업로드 후) 동일한 결과를 얻었습니다. –

0

아카이브 유틸리티가 zip 파일을 zip 파일로 인식하지 못하고 zip 아카이브 자체를 압축하려고했습니다. 두 번째 작업은 생성 된 첫 번째 파일의 압축을 풀기 때문에 파일을 전혀 열지 않습니다. 이는 zip이 손상 되었기 때문입니다.

다운로드 프로세스 중에 브라우저가 어떻게 든 zip 파일 (줄 바꿈 변환?)을 왜곡했을 수 있습니다. 앞서 언급했듯이 MIME 유형을 확인하고 PHP 헤더()를 사용하여 올바른 MIME 유형 (응용 프로그램/압축 파일)을 설정하십시오.

+0

좋아, 행운과 함께 응용 프로그램/우편 번호를 사용해 보았습니다. 브라우저 다운로드 대화 상자는 "PC Zip 보관함"을 다운로드하려고 시도하고 있으며 내 컴퓨터에 다운로드 할 때 OS X에서 "종류 : ZIP 보관함"을 표시하지만 압축을 풀 때도 동일한 작업을 수행합니다. (이것은 내가 업로드하기 전에 내 컴퓨터에서 작동했던 즉석에서 압축하지 않은 하드 코딩 된 파일이기도합니다.) –

8

이 문제가있어서 다운로드 한 zip 파일에 처음부터 새 줄이 삽입되어있는 것으로 나타났습니다.

가 잘못되지 ob_clean 및 세척 기능을 응용 프로그램/octet-stream을의

header("Pragma: public"); 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private",false); 
    header("Content-Type: application/octet-stream"); 
    header("Content-Disposition: attachment; filename=".basename($archive_file_name)); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: ".filesize($archive_file_name)); 
    ob_clean(); 
    flush(); 
    echo readfile("$archive_file_name");