1

このコードを使用して、ユーザーがzipファイルをダウンロードできるようにします。

if(file_exists($filename)){
         header("Content-Disposition: attachment; filename=".basename(str_replace(' ', '_', $filename)));
         header("Content-Type: application/force-download");
         header("Content-Type: application/octet-stream");
         header("Content-Type: application/download");
         header("Content-Description: File Transfer");
         header("Content-Length: " . filesize($filename));
         flush();

         $fp = fopen($filename, "r");
         while (!feof($fp))
         {
             echo fread($fp, 65536);
             flush();
         }
         fclose($fp);
     exit;
}

ファイルをダウンロードすると、25,632キロバイトのデータしかダウンロードされません。ただし、zipファイルは26,252キロバイトです...

なぜブラウザは25MBをすべて取得するのに、停止するのですか?

ヘッダーをチェックして、Content-Lengthそれが正しいことを確認しました...

編集

Firefoxでは、ファイルをダウンロードすると「25mbの」と表示されるので、ブラウザは25mbが完全な量であると見なします...しかし、エコーされたときのコンテンツの長さは26252904ですか?

4

5 に答える 5

6

これをコードの前に追加します

ob_clean();
ob_end_flush();
于 2016-03-12T09:55:03.010 に答える
3

header('Content-Type ...)最後の呼び出しのみがブラウザーに送信されるため、呼び出しは役に立ちません。

ダウンロードは によってトリガーされContent-Disposition: attachmentます。Content-Type: application/zipzip ファイルを送信する場合は、実際のファイルを送信する必要があります。

最後に、読み取りループは不要です。

すべてをまとめると、コードは次のようになります。

if (file_exists($filename)) {
    $quoted_filename = basename(addcslashes($filename, "\0..\37\"\177"));
    header("Content-Disposition: attachment; filename=\"{$quoted_filename}\"");
    header('Content-Type: application/zip');
    header('Content-Length: '.filesize($filename));
    readfile($filename);
}
于 2012-05-30T13:53:45.870 に答える
0

私も同様の問題を抱えていました。ファイルはFirefoxで正常にダウンロードされましたが、IEではダウンロードされませんでした。Apacheがファイルを圧縮していて、IEが解凍できなかったため、ファイルが破損しているようです。解決策は、Apacheでgzipを無効にすることでした。PHPがその場でgzipしていないかどうかを確認し、無効にすることもできます。Apacheの場合、次のことを試すことができます。

SetEnv no-gzip 1

PHPの場合、.htaccessで:

php_flag zlib.output_compression on
于 2012-05-30T14:07:45.007 に答える
0

単一の MIME タイプを使用してデータを表します。

この場合、 を使用application/octet-streamするとうまくいきます。これは、事前に MIME がわからない場合です。それがわかったら、それを入れなければなりません。複数の content-type ヘッダーを使用しないでください。

通常、ブラウザーが特定の MIME の処理方法を認識していない場合、ダウンロード プロセスがトリガーされます。さらに、 を使用すると、Content-disposition: Attachment; ..それが保証されます。

readfile($filename)以下のように、ファイルのバイトを要求プロセスに送信する単純なものが存在します。

header("Content-disposition: attachment;filename=" . basename($filename);
readfile($filename);
于 2012-05-30T13:24:25.277 に答える
0

この答えは決して本当の答えではありません。

しかし、私はそれを機能させました... Content-Length を 30000000 に設定しただけです。そのため、ファイルが実際よりも大きいと見なされ、すべてダウンロードされます。

醜いハックは知っていますが、他の方法は見つかりませんでした

于 2012-05-30T14:39:08.163 に答える