54

リンクにアクセスしたときにブラウザがファイルをローカル マシンに自動的にダウンロードするようにするには、PHP にどのコードを追加する必要がありますか?

ソフトウェアの名前をクリックすると、ユーザーにファイルをディスクに保存するように求めるダウンロード サイトと同様の機能を具体的に考えていますか?

4

5 に答える 5

61

ファイルを出力する前に、次のヘッダーを送信します。

header("Content-Disposition: attachment; filename=\"" . basename($File) . "\"");
header("Content-Type: application/octet-stream");
header("Content-Length: " . filesize($File));
header("Connection: close");

@grom : 「application/octet-stream」MIME タイプについて興味深い。私はそれを認識していませんでした。常に「application/force-download」を使用していました:)

于 2008-09-03T00:07:32.500 に答える
43

以下は、pdf を返送する例です。

header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
header('Content-Transfer-Encoding: binary');
readfile($filename);

@Swish application/force-download コンテンツ タイプが何か違うことをするのを見つけられませんでした (IE と Firefox でテスト済み)。実際の MIME タイプを返送しない理由はありますか?

また、 Hayley Watsonが投稿した PHP マニュアルにも、次のように記載されています。

ファイルをレンダリングするのではなく、強制的にダウンロードして保存したい場合は、「application/force-download」などの MIME タイプがないことに注意してください。この状況で使用する正しいタイプは「application/octet-stream」であり、他のものを使用することは、クライアントが認識されていない MIME タイプを無視し、代わりに「application/octet-stream」を使用することになっているという事実に依存しているだけです (参照: セクションRFC 2046 の 4.1.4 および 4.5.1)。

また、 IANAによると、登録済みのアプリケーション/強制ダウンロード タイプはありません。

于 2008-09-03T00:05:26.937 に答える
12

きれいな例。

<?php
    header('Content-Type: application/download');
    header('Content-Disposition: attachment; filename="example.txt"');
    header("Content-Length: " . filesize("example.txt"));

    $fp = fopen("example.txt", "r");
    fpassthru($fp);
    fclose($fp);
?>
于 2011-12-01T22:45:05.073 に答える
0

私のコードは、txt、doc、docx、pdf、ppt、pptx、jpg、png、zip 拡張子で機能します。実際の MIME タイプを明示的に使用する方がよいと思います。

$file_name = "a.txt";

// extracting the extension:
$ext = substr($file_name, strpos($file_name,'.')+1);

header('Content-disposition: attachment; filename='.$file_name);

if(strtolower($ext) == "txt")
{
    header('Content-type: text/plain'); // works for txt only
}
else
{
    header('Content-type: application/'.$ext); // works for all extensions except txt
}
readfile($decrypted_file_path);
于 2012-04-04T15:17:16.240 に答える