ホームページ  >  記事  >  バックエンド開発  >  PHPのファイルダウンロード機能で超詳細なプロセス分析を実現_PHPチュートリアル

PHPのファイルダウンロード機能で超詳細なプロセス分析を実現_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:18:061079ブラウズ

クライアントがサーバーからファイルをダウンロードするプロセスの分析:

ブラウザーは、サーバー内の特定の Web ページ (down.php など) にアクセスするためのリクエストを送信します。Web ページのコードは次のとおりです。
サーバーはリクエストを受信すると、すぐに down.php ファイルを実行します。
ファイルを実行するときは、ダウンロードするファイルをメモリに読み込む必要があります (ここでは、fopen を介して、Christmas Carnival.jpg の画像を示します)。 ( ) 関数を使用してこのアクションを完了します
注: サーバーからのダウンロードに関連するファイル操作は、まずサーバー側のメモリにファイルを読み取る必要があります

ファイルはすでにメモリ内にあるため、ファイルをfread() 関数はこのアクションを完了します
ファイルが大きい場合は、ファイルが複数のセグメントに分割されてクライアントに返される必要があることに注意してください。ファイルが完全に読み取られるまで待機しません。これによりサーバーの負荷が増加するため、一度サーバーにアクセスしてクライアントに戻ります。
そのため、PHP コードで 1 回読み取るバイト数を設定する必要があります。たとえば、次のコードで $buffer=1024 を介して 1 回読み取るバイト数を設定すると、読み取られるたびにデータが出力されます。は、ブラウザに返されます)

フローチャート:
PHPのファイルダウンロード機能で超詳細なプロセス分析を実現_PHPチュートリアル

コードをコピー コードは次のとおりです:

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)){
echo "そのようなファイルはありません"
}
$fp=fopen($file_path,"r");
/ / ファイルのダウンロードに必要なヘッダー
Header("Content-type: application/octet-stream")
Header("Accept-Length:".$file_size); );
Header("Content-Disposition:attachment; filename=".$file_name);
$buffer=1024;
//while(!feof($fp) && $file_count< ;$file_size){
$file_con=fread($fp,$buffer);
echo $file_con;


;注意すべき点:

header("Content-type:text/html;charset=utf-8") の役割: サーバーがブラウザのリクエストに応答するとき、コンテンツを UTF-8 エンコードで表示するようにブラウザに指示します。 format
について 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) は、バッファーに残っている最後のデータをディスク ファイルに出力し、ファイル ポインターと関連するバッファーを解放できます



http://www.bkjia.com/PHPjc/325568.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/325568.html

技術記事

クライアントがサーバーからファイルをダウンロードするプロセスの分析: ブラウザーは、サーバー内の特定の Web ページ (down.php など) にアクセスするためのリクエストを送信します。Web ページのコードは次のとおりです。 サーバーが応答します...

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。