.mp3 ファイルを提供しています (エンドユーザーがファイルの名前を変更して保存できるダウンロード ダイアログ ボックスとして)。これについては、フォーラムや php マニュアルのコメント内でさえ、多くの矛盾する推奨事項があります。
私の問題を解決し、この目標を最もよく実行する方法についてのリファレンスをここに作成したいと考えています。つまり、ダウンロード可能なファイルの配信を開始するための最も効率的な方法について、PHP コーダーを開始することで使用できる明確な「ベスト プラクティスの概要」です。
ここのコードを確認し、修正を提案していただければ幸いです。これは、アーティストが音楽や本などを自費出版するのを支援するサイトの一部です。
テストするために、これを index.php としてサーバーにアップロードしています。おそらくそれも問題の一部です。
このスクリプトの現在の状態は、ブラウザーが少しハングアップし、バイナリがテキストとしてブラウザーの表示ウィンドウに読み込まれることです。
問題は重要な「Content-Length」ヘッダーの構文、またはヘッダーの順序にあると多くの点で考えていたので、そのすべてのバージョンをいくつか試しましたが、ダウンロードを中断するものはありませんでした。
これは私が今自分で試している正確なコードです。
ここで ####### は 7 つの数字 (バイト単位の実際のファイル サイズ) を意味し、他のすべては明確なはずです。
<?php
header('Server: ');
header('X-Powered-By: ');
header('Cache-Control: no-cache');
header('Expires: -1');
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Content-Type: audio/mpeg');
header('Content-Disposition: attachment;filename="suggested-save-name.mp3"');
header('Content-Length: #######["exact-file-name.mp3"]');
@readfile("http://full-public-url.com/exact-file-name.mp3");
ob_clean();
flush();
exit;
?>
次の応答ヘッダーを返します。
>X-Powered-By:PHP/5.4.xy
>Vary:negotiate
>Transfer-Encoding:chunked
>TCN:choice
>Server:Apache
>Keep-Alive:timeout=2, max=200
>Date:Fri, 10 May 2013 16:mm:ss GMT
>Content-Type:text/html
>Content-Location:filename.php
>Connection:Keep-Alive
スクリプトの構文、または .php ファイルの作成方法と保存方法の単純なエラー (または複数のエラー) であることを願っています。設定がデフォルトで、php が最新で、.htaccess の問題がないことを確認しました。このファイルと web ディレクトリ内の他のすべてのファイルの末尾に余分なスペースがないことを慎重に確認しました?>
。
前もって感謝します ...
以下の回答を読んだ後の最適なスクリプト:
<?php
$file-variable=('./exact-file-name.mp3')
$size=filesize($file-variable);
header('Server: ');
header('X-Powered-By: ');
header('Cache-Control: no-cache');
header('Expires: -1');
header('Content-Type: application/octet-stream'); //will need to redirect for older IE
header('Content-Disposition: attachment; filename="suggested-save-name.mp3"');
header('Content-Length: "$size"');
@readfile("$file-variable");
ob_clean();
flush();
exit;
より良いスクリプトからの成功した応答ヘッダー (および UTF-8 BOM を削除した後):
>Vary:negotiate
>TCN:choice
>Server:Apache //How can I hide this?
>Keep-Alive:timeout=2, max=200
>Expires:-1
>Date:Sat, 11 May 2013 12:mm:ss GMT
>Content-Type:audio/mpeg
>content-transfer-encoding:binary
>Content-Location:filename.php //I would also like to obfuscate this
>Content-Length:#######
>Content-Disposition:attachment; filename="suggested-save-name.mp3"
>Content-Description:File Transfer
>Connection:Keep-Alive
>Cache-Control:no-cache