ブラウザは、サーバー内の特定の Web ページ (down.php など) にアクセスするためのリクエストを送信します。Web ページのコードは次のとおりです。
クライアントがサーバーからファイルをダウンロードするプロセスの分析:
ブラウザがサーバー内の Web ページ (例: down.php) へのアクセスを要求するリクエストを送信する場合、Web ページのコードは次のとおりです。
サーバーはリクエストを受信すると、すぐに down.php ファイルを実行します。
ファイルを実行するときは、ダウンロードするファイルをメモリに読み込む必要があります (ここでは、fopen を介して、Christmas Carnival.jpg の画像を示します)。 ( ) 関数を使用してこのアクションを完了します
注: サーバーからのダウンロードに関連するファイル操作は、まずサーバー側のメモリにファイルを読み取る必要があります
ファイルはすでにメモリ内にあるため、ファイルをfread() 関数はこのアクションを完了します
ファイルが大きい場合は、ファイルが複数のセグメントに分割されてクライアントに返される必要があることに注意してください。ファイルが完全に読み取られるまで待機しません。これによりサーバーの負荷が増加するため、一度サーバーにアクセスしてクライアントに戻ります。
そのため、PHP コードで 1 回読み取るバイト数を設定する必要があります。たとえば、次のコードで $buffer=1024 を介して 1 回読み取るバイト数を設定すると、読み取られるたびにデータが出力されます。は、ブラウザに返されます)
フローチャート:
コードをコピー コードは次のとおりです:
header("Content-type:text/html;charset=utf-8 ");
// $file_name="cookie.jpg";
$file_name="クリスマスカーニバル.jpg";
//中国語が表示できない問題を解決するには
$file_name=iconv("utf-8", "gb2312",$file_name );
$file_sub_path=$_SERVER['DOCUMENT_ROOT']."marcofly/phpstudy/down/down/";
$file_path=$file_sub_path.$file_name;存在します
if (!file_exists($file_path)){
エコー "そのようなファイルはありません" ;
$fp=fopen($file_path,"r");
$file_size=file_path); // ファイルのダウンロードに必要なヘッダー
Header("Content-type: application/octet-stream")
Header("Accept-Length:".$file_size); ;
Header("Content-Disposition:attachment; filename=".$file_name);
$buffer=1024;
//データをブラウザに返す
(!feof($fp) && $ file_count< $file_size){
$file_con=fread($fp,$buffer);
fclose($fp);注意すべき点:
header("Content-type:text/html;charset=utf-8") の役割: サーバーがブラウザのリクエストに応答するとき、ブラウザに次のエンコード形式でコンテンツを表示するように指示します。 UTF-8
file_exists()関数が中国語のパスをサポートしていない問題について:PHPの関数は比較的初期のもので中国語をサポートしていないため、ダウンロードしたファイル名が中国語の場合、文字エンコードを変換する必要があります。そうしないと、file_exists() 関数が認識できないため、iconv() 関数がエンコード変換を実行します
$file_sub_path() 相対パスより効率的な絶対パスを使用します
Header("Content- type: application/octet-stream"): このコードを通じてクライアント。ブラウザはサーバーから返されたファイル形式を知ることができます。Header("Accept-Ranges: bytes") の機能は、ファイルのサイズをクライアントに伝えることです。ブラウザーによって返されるファイルのサイズはバイト単位で計算されます。 Header("Accept-Length:" .$file_size): ブラウザーに返されるファイルのサイズを伝えます。
Header("Content-Disposition:attachment; filename=".$file_name):ブラウザーが返したファイルの名前
上記の 4 つの Header() は必須です
fclose($fp) はバッファーに残っている最後のデータをディスク ファイルに出力し、ファイル ポインターと関連するバッファーを解放できます