PHP でダウンロードを自動的に開始するにはどうすればよいですか?
-
09-06-2019 - |
質問
リンクにアクセスしたときにブラウザがファイルをローカル マシンに自動的にダウンロードするには、PHP にどのようなコードを追加する必要がありますか?
具体的には、ソフトウェア名をクリックするとファイルをディスクに保存するようにユーザーに促すダウンロード サイトと同様の機能を考えています。
解決
ファイルを出力する前に、次のヘッダーを送信します。
header("Content-Disposition: attachment; filename=\"" . basename($File) . "\"");
header("Content-Type: application/octet-stream");
header("Content-Length: " . filesize($File));
header("Connection: close");
@グロム:「application/octet-stream」MIME タイプについては興味深いです。私はそのことを知りませんでした。いつも「application/force-download」を使用していました:)
他のヒント
PDF を返送する例を次に示します。
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
header('Content-Transfer-Encoding: binary');
readfile($filename);
@ヒュッと振る application/force-download コンテンツ タイプで別のことを行うものは見つかりませんでした (IE と Firefox でテスト済み)。実際の MIME タイプを返送しない理由はありますか?
PHPマニュアルにも載ってます ヘイリー・ワトソン 投稿:
ファイルをレンダリングするのではなく、強制的にダウンロードして保存したい場合は、「application/force-download」などの MIME タイプが存在しないことに注意してください。この状況で使用する正しいタイプは「application/octet-stream」であり、他のものを使用することは、クライアントが認識できない MIME タイプを無視し、代わりに「application/octet-stream」を使用することになっているという事実に依存しているだけです (参照:RFC 2046 のセクション 4.1.4 および 4.5.1)。
またそれに応じて イアナ 登録されたアプリケーション/強制ダウンロード タイプはありません。
きれいな例です。
<?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);
?>
私のコードは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);