0

.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
4

1 に答える 1

0

ステップ 1 は、HTTP 標準で定義されていない意味のないヘッダーをすべて削除することです。

これにより、 と が削除さContent-DescriptionContent-Transfer-Encodingます。どちらもせいぜい役に立たず、最悪の場合、通常のブラウザー操作に干渉する可能性があります。

ステップ 2 は、ファイル配信を最適化することです。HTTP リクエストで MP3 をダウンロードしないでください。サーバー上の FILE にアクセスしてください。URL は使用せず、ファイル パスを使用してください。MP3 がスクリプトのすぐ隣にある場合、これは機能します。

readfile('./exact-file-name.mp3');

この時点で、通常は作業用のダウンロードが完了するはずです。そうでない場合は、 をより一般的なものに変更してみてくださいContent-Typeaudio/mpeg一部のブラウザーでオーディオ プレーヤーをトリガーする可能性がありapplication/octet-streamますが、ほとんどのブラウザーで動作するはずですが、古い Internet Explorer では、このブラウザーを含む特定の MIME タイプで不適切なコンテンツ スニッフィングが行われます。application/x-ms-downloadそれならうまくいくはずです。

ヘッダーが送信されていることを確認します。HTTP 本文がすでに開始されている場合、PHP は HTTP ヘッダーを送信しません。また、UTF-8 BOM を含む空白は本文の出力をトリガーします。

一般的な「最終」ヘッダーに関するいくつかのコメント:

Content-Length:長さをバイト単位で示す整数のみを持つ必要があります。特に、角括弧内のファイル名については言及されていません。

Content-Transfer-EncodingそしてContent-Descriptionまだ役に立たない。

Content-Location必要ありません。それが何をするかわからない場合は、省略してください。ここでは難読化は機能しません。ブラウザは、アクセスしている URL を知る必要があります。このヘッダーでこの URL を複製しても何も変わりません。難読化すると、どこかで問題が発生する可能性があります。

ダウンロードに必要な 2 つのヘッダーは、Content-Typeと (ユーザーのファイル名を事前に定義する場合)Content-Dispositionです。

于 2013-05-09T00:11:25.787 に答える