したがって、ブラウザで再生する代わりに MP3 を強制的にダウンロードする方法は、MIME タイプをファイルとして設定するか、.htaccess で Content-Disposition 応答ヘッダーを設定することです。
これら 2 つの方法の違いは何ですか? また、どちらか一方または両方を使用する方がよいでしょうか?
<audio>
また、 MP3 ファイルをソースとして使用する場合、これらのいずれかを行うと、HTML5 のタグの処理が壊れますか?
したがって、ブラウザで再生する代わりに MP3 を強制的にダウンロードする方法は、MIME タイプをファイルとして設定するか、.htaccess で Content-Disposition 応答ヘッダーを設定することです。
これら 2 つの方法の違いは何ですか? また、どちらか一方または両方を使用する方がよいでしょうか?
<audio>
また、 MP3 ファイルをソースとして使用する場合、これらのいずれかを行うと、HTML5 のタグの処理が壊れますか?
1. ヘッダーを正しく使用する これは非常に広範囲に及ぶ問題であり、残念ながら PHP のマニュアルでさえエラーに悩まされています。開発者は通常、「これでうまくいく」と言い、完全には理解していないものをコピーします。まず、Content-Description や Content-Transfer-Encoding などのヘッダーの使用に気付きました。HTTPにはそのようなものはありません。信じられない?RFC2616 を見てください。「HTTP は、MIME とは異なり、Content-Transfer-Encoding を使用せず、Transfer-Encoding と Content-Encoding を使用します」と具体的に述べています。必要に応じてこれらのヘッダーを追加できますが、まったく何もしません。残念ながら、この間違った例は PHP のマニュアルにもあります。次に、MIME タイプに関しては、Content-Type: application/force-download のようなものをよく見かけます。そのようなものと Content-Type はありません: application/octet-stream (RFC1521) も問題なく動作します (または、exe/dll の場合は application/x-msdownload かもしれません)。Internet Explorer について考えている場合は、コンテンツを強制的に「盗聴」するよりも、明確に指定する方がよいでしょう。詳細については、Internet Explorer での MIME タイプの検出を参照してください。
さらに悪いことに、次のような発言が見られます。
header("Content-Type: アプリケーション/強制ダウンロード");
header("Content-Type: アプリケーション/オクテット ストリーム");
header("Content-Type: アプリケーション/ダウンロード");
作成者は本当にイライラして、3 つの Content-Type ヘッダーを追加したに違いありません。唯一の問題は、header() マニュアル エントリで指定されているように、次のとおりです。デフォルトでは、「. したがって、header("Content-Type: some-value", FALSE) を指定しない限り、新しい Content-Type ヘッダーが古いものを置き換えます。
2. 強制ダウンロードと Internet Explorer のバグ 古いバージョンの Internet Explorer について心配する必要がなくなるとはどういうことでしょうか? より良い世界、それは確かです。
ファイルを強制的にダウンロードする正しい方法は次のとおりです。
header("Content-Disposition: attachment; filename=\"$file_name\"");
注: ファイルにスペースが含まれている可能性がある場合は、ファイル名に引用符が必要です。上記のコードは、次のものが追加されていない限り、IE6 では失敗します。
header("プラグマ: public");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
現在、Microsoft によると、この場合、特に両方の値がゼロに設定されている Cache-Control の使用は間違っていますが、IE6 と IE7 で機能し、後で無視されるため、害はありません。それでもダウンロード時に (特に IE で) 奇妙な結果が得られる場合は、PHP 出力圧縮とサーバー圧縮が無効になっていることを確認してください (サーバーが、PHP スクリプトによって生成された出力に誤って圧縮を適用する場合があります)。
これを見て、
.mp3 オーディオ/mpeg3
.mp3 オーディオ/x-mpeg-3
.mp3 ビデオ/mpeg
.mp3 ビデオ/x-mpeg
詳細については、このリンクを参照してください。
Content-Disposition: attachment... を使用すると、右クリック -> 対象をファイルに保存する代わりに、強制的にダウンロード ボックスが表示されます。