# 推奨: 「php でファイルをダウンロードする方法: 1. "$_GET['file']" からファイル パスを取得します; 2. ヘッダー情報を設定します; 3. "file_get_contents()" と "file( )" メソッド; 4. "readfile" メソッドと "fopen" メソッドを通じて。
PHP ビデオ チュートリアル 」
PHP でファイルをダウンロードする方法
1. ファイル パスを取得します$_GET['file']$path_parts = pathinfo($_GET['file']); $file_name = $path_parts['basename']; $file_path = '/mysecretpath/' . $file_name;
$mypath = '/mysecretpath/' . $_GET['file'];
header('Content-Description: File Transfer'); //描述页面返回的结果 header('Content-Type: application/octet-stream'); //返回内容的类型,此处只知道是二进制流。具体返回类型可参考http://tool.oschina.net/commons header('Content-Disposition: attachment; filename='.basename($file));//可以让浏览器弹出下载窗口 header('Content-Transfer-Encoding: binary');//内容编码方式,直接二进制,不要gzip压缩 header('Expires: 0');//过期时间 header('Cache-Control: must-revalidate');//缓存策略,强制页面不缓存,作用与no-cache相同,但更严格,强制意味更明显 header('Pragma: public'); header('Content-Length: ' . filesize($file));//文件大小,在文件超过2G的时候,filesize()返回的结果可能不正确
$str = file_get_contents($file); echo $str;
$f = file($file); while(list($line, $cnt) = each($f)) { echo $cnt; }
while (ob_get_level()) ob_end_clean(); //设置完header以后 ob_clean(); flush(); //清空缓冲区 readfile($file);
readfile() は、複数の人がファイルを読み取る場合にも PHP メモリの枯渇を引き起こします: http://stackoverflow.com/questions/6627952/why-does-readfile-exhaust-php-memoryPHP はファイルを読み取って出力バッファに書き込む必要があるため、300Mb ファイルの場合、どのような実装を記述したとしても (多数の小さなセグメントごと、または 1 つの大きなチャンクごと)、PHP は 300Mb のファイルを読み取らなければなりません。#複数のユーザーがファイルをダウンロードする必要がある場合、問題が発生します (1 つのサーバーでは、ホスティング プロバイダーが各ホスティング ユーザーに与えられるメモリを制限します。このように制限されたメモリでは、バッファを使用することはできません) )
私は、直接リンクを使用してファイルをダウンロードする方が、大きなファイルに対してははるかに優れたアプローチだと思います。
主な考え方: PHP は、 file を作成し、バッファに出力します。 300M ファイルの場合、PHP は依然として 300M のメモリを読み取る必要があります。したがって、複数のユーザーが同時にダウンロードすると、バッファーもメモリ不足になります。 (間違っていたら修正してください)
たとえば、100 人のユーザーがダウンロードしている場合、100*buffer_size のメモリが必要になります
6. 出力ファイルの fopen() メソッド
set_time_limit(0); $file = @fopen($file_path,"rb"); while(!feof($file)) { print(@fread($file, 1024*8)); ob_flush(); flush(); }
fopen() は大きなファイルを読み取ることができ、毎回読み取る内容の一部を指定できます。大きなファイルを操作する場合にも役立ちます
7. 概要
PHP を使用してファイルをダウンロードする場合は、シナリオに注意する必要があります。少数の小さなファイルだけをダウンロードする場合は、PHP を使用してダウンロードする方が良いですが、PHP が多数のダウンロード要求に耐える必要がある場合は、ファイルのダウンロードを PHP で行うべきではありません。
Apache の場合、mod_xsendfile を使用するとダウンロード タスクを完了でき、より簡単かつ高速になります。
以上がphpでファイルをダウンロードする方法【まとめ】の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。