1

参考までに、私はすでにこれらのスレッドと他のいくつかのスレッドで回答を読んで試しました。

php を使用した zip ファイルの作成と提供

ダウンロードしたzipファイルを開くとcpgzファイルが作成されますか?

サーバーにzipファイルがあります。

  1. Filezilla を使用してその Zip ファイルをサーバーから Mac に移動すると、通常どおり開くことができます。

  2. この PHP コードを使用して Zip ファイルを Linux マシンにダウンロードすると、正常に開きます。

  3. この PHP コードを使用して、Safari または Firefox を使用して Mac に Zip ファイルをダウンロードすると、「解凍に失敗しました」または「アーカイブの構造が破損しています」というエラーが表示されるか、.cpgz ファイルが取得されます。は、コンピューターがファイルを解凍するのではなく、圧縮していることを意味します。

zip ファイルを配信するために使用している PHP コードを次に示します。

$zipname = "myfile.zip";
$zippath = "/path/to/" . $zipname;

      if ($downloadzip = fopen ($zippath, "r")) {
            $fsize = filesize($zippath);

            header("Content-type: application/zip");
            header("Content-Disposition: attachment; filename=\"".$zipname."\"");
            header("Content-length: $fsize");
            header('Content-Transfer-Encoding: binary');
            #header("Cache-control: private"); //use this to open files directly

            echo fpassthru($downloadzip); // deliver the zip file

        }
        fclose ($downloadzip);

機能するヘッダーがいくつか見つかりました。なぜ機能するのかはよくわかりませんが、機能することをうれしく思います....htaccessファイル、php.ini / zlib設定など、さまざまなことを試しました。

これが答え です http://perishablepress.com/http-headers-file-downloads/

$zipName = 'myfile.zip';
$zipPath = 'mydirectory/' . $zipName;


    if (file_exists($zipPath)) {

        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=\"".$zipName."\"");
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: ".filesize($zipPath));
        ob_end_flush();
        @readfile($zipPath);
}
4

3 に答える 3

5

これが機能するものです

$zipName = 'myfile.zip';
$zipPath = 'mydirectory/' . $zipName;

    if (file_exists($zipPath)) {

        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=\"".$zipName."\"");
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: ".filesize($zipPath));
        ob_end_flush();
        @readfile($zipPath);
}
于 2012-09-13T23:29:53.313 に答える
0

$fsize 変数が引用符で囲まれているため、そのヘッダーに書き込まれていないことはご存知だと思います。次のようなことを試すことができます:

header('Cache-Control: public');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename=\"".$zipname."\"');
header('Content-Type: application/zip');
于 2012-09-13T17:24:42.537 に答える