リンクにアクセスしたときにブラウザがファイルをローカル マシンに自動的にダウンロードするようにするには、PHP にどのコードを追加する必要がありますか?
ソフトウェアの名前をクリックすると、ユーザーにファイルをディスクに保存するように求めるダウンロード サイトと同様の機能を具体的に考えていますか?
リンクにアクセスしたときにブラウザがファイルをローカル マシンに自動的にダウンロードするようにするには、PHP にどのコードを追加する必要がありますか?
ソフトウェアの名前をクリックすると、ユーザーにファイルをディスクに保存するように求めるダウンロード サイトと同様の機能を具体的に考えていますか?
ファイルを出力する前に、次のヘッダーを送信します。
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」を使用していました:)
以下は、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によると、登録済みのアプリケーション/強制ダウンロード タイプはありません。
きれいな例。
<?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);