문제

다음 코드를 사용하여 디렉토리에서 zip 파일을 만들고 HTTP 다운로드를 통해 사용자에게 제공하려고합니다.

 // 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이라고 말하고 파일을 zpiping으로 cours.zip.cpgz를 제공하고 그 파일이 코스를 다시 제공합니다.

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

감사!

도움이 되었습니까?

해결책

  1. 요청할 때마다 재배치하는 것은 좋은 생각이 아닙니다. zip 파일이 아직 존재하지 않는 경우에만 해보십시오.

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

  3. 다운로더가 파일의 끝을 알 수 있도록 콘텐츠 길이 헤더 지정이 필요합니다. 진행 상황 제어, 파일의 손상 감지 및 HTTP 세션의 중단을 피할 수 있습니다 (연결이 유지 모드에있는 경우) 이 헤더의 부족은 문제의 근원입니다.

다른 팁

나는이 문제가 있었고 다운로드 된 zip 파일에 처음에 새로운 라인이 삽입 된 것으로 밝혀졌습니다.

OB_CLEAN 및 플러시 함수를 사용하여 해결합니다

    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");

제안한대로 Karim79, 나는 내 의견을 답으로 올려 줄 것이다 : MIME 유형을 응용 프로그램/옥켓-스트림에서 응용 프로그램/zip으로 변경하면 어떻게됩니까?

또한 명령 줄 지퍼 프로그램을 사용하고 있지만 ZIP의 성공을 확인하지 않으며 파일을 최종 사용자 브라우저로 보내기 전에 파일이 존재하는지 확인하지 않습니다. 올바르게 형성된 zip 파일을 보장하기 위해 수동으로 zip을 사용하여 파일 이름을 하드 코딩하려고 시도한 다음 코드가 브라우저에 올바르게 침을 뱉을 지 확인하십시오.

당신이보고있는 것은 아카이브 유틸리티가 zip 파일을 zip 파일로 인식하지 않고 Zip Archive 자체를 압축하려고 시도한다는 것입니다. 두 번째 작업은 단순히 첫 번째 파일을 제작하므로 실제로 파일을 전혀 열지 않습니다. 이것은 지퍼가 손상 되었기 때문입니다.

다운로드 프로세스 중에 브라우저가 어떻게 든 ZIP 파일 (Newline Conversions Alothing?)을 엉망으로 만들 수 있습니다. 언급했듯이 MIME 유형을 확인하고 PHP 헤더 ()를 사용하여 올바른 MIME 유형 (Application/Zip)을 설정하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top