PHP でファイルをダウンロードする方法
$_GET['file'] からファイル パスを取得します
$path_parts = pathinfo($_GET['file']);$file_name = $path_parts['basename'];$file_path = '/mysecretpath/' . $file_name;
パスを取得するには必ず上記のメソッドを使用してください。単純に文字列を連結して取得することはできませんパス
$mypath = ' /mysecretpath/' . $_GET['file'];
入力が ../../ の場合、任意のパスにアクセスできます
このように、ファイルがわずかに大きい限り、それはメモリ制限
4. 出力ファイル file() メソッド
header('Content-Description: File Transfer'); //描述页面返回的结果header('Content-Type: application/octet-stream'); //返回内容的类型,此处只知道是二进制流。具体返回类型可参考http://tool.oschina.net/commonsheader('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()返回的结果可能不正确
大きい場合、メモリ制限も超えます
5. 出力ファイルの readfile() メソッド
前提条件は、最初にバッファをクリアしてそれを許可することです ユーザーにはファイルをダウンロードするためのダイアログボックスが表示されます
$str = file_get_contents($file);echo $str;
ファイルをダウンロードするのに直接リンクを使用するのは問題があると思います。大きなファイルに対するより良いアプローチです。複数のユーザーがファイルをダウンロードする必要がある場合、 (1 つのサーバーでは、ホスティング プロバイダーが各ホスティング ユーザーに与えるメモリを制限します。メモリが限られているため、バッファを使用するのは得策ではありません。)
主なアイデア: PHP はすべてのファイルを必要とし、それらをバッファーに出力します。 300M ファイルの場合、PHP は依然として 300M のメモリを読み取る必要があります。したがって、複数のユーザーが同時にダウンロードすると、バッファーもメモリ不足になります。 (間違っていたらご指摘ください)
たとえば、100 人のユーザーがダウンロードしている場合、100*buffer_size のメモリが必要になります
6. 出力ファイルの fopen() メソッド
$f = file($file);while(list($line, $cnt) = each($f)) { echo $cnt;}
7. まとめ
Apache の場合は、ダウンロード タスクを完了するのに役立つ mod_xsendfile があり、よりシンプルかつ高速です