2

Ubuntu の /tmp フォルダーから zip ファイルをダウンロードしようとしています。ただし、Php コードを実行すると、ダウンロード ボックスが表示される代わりに、ブラウザーにゴミのテキストが表示されます。単純なテキスト ファイルを試してみたところ、ダウンロード ダイアログ ボックスが表示される代わりに、その内容がブラウザに出力されました。この強制ダウンロードが機能しない理由。以下はコードです。

if (file_exists($dir.$filename)) {
            header("Content-type: application/force-download");
            header("Content-Transfer-Encoding: Binary");
            header("Content-length: ".filesize($dir.$filename));
            header('Content-disposition: attachment; filename='.basename($dir.$filename));
            readfile($dir.$filename);
            exit(0);
        }

    `    
4

2 に答える 2

5

ブラウザの MIME タイプが「application/force-download」の場合、ブラウザはそれをどう処理すればよいかわかりません。

zip ファイルなので、MIME タイプは「application/octet-stream」または「application/zip」にしてください。

if (file_exists($dir . $filename)) {
        header("Content-type: application/zip");
        header("Content-Transfer-Encoding: Binary");
        header("Content-length: " . filesize($dir . $filename));
        header('Content-disposition: attachment; filename=' . basename($dir . $filename));
        readfile($dir . $filename);
        exit(0);
    }
于 2011-12-15T09:15:02.827 に答える
0

ファイル全体をメモリに読み込むことはできません。readfile($_REQUEST['file']); を変更してください。の中へ:

$handle=fopen($_REQUEST['file'], 'rb');
while (!feof($handle))
{
    echo fread($handle, 8192);
    flush();
}
fclose($handle);

これにより、8kb のファイルが読み取られ、クライアントにプッシュされます。これは、ファイル全体を一度に読み取らないため、あまりメモリを消費しません。

また、ダウンロードを強制する場合は常にapplication/octet-streamこれを使用して、バイナリ ファイルを正しく送信するようにします。

于 2014-05-03T19:23:06.853 に答える