ホームページ > バックエンド開発 > PHPチュートリアル > PHPでファイルをダウンロードする方法

PHPでファイルをダウンロードする方法

WBOY
リリース: 2016-06-23 13:28:16
オリジナル
1156 人が閲覧しました

PHP でファイルをダウンロードする方法

1. ファイル パスを取得します

$_GET['file'] からファイル パスを取得します

$path_parts = pathinfo($_GET['file']);$file_name  = $path_parts['basename'];$file_path  = '/mysecretpath/' . $file_name;
ログイン後にコピー

パスを取得するには必ず上記のメソッドを使用してください。単純に文字列を連結して取得することはできませんパス
$mypath = ' /mysecretpath/' . $_GET['file'];
入力が ../../ の場合、任意のパスにアクセスできます

2. ヘッダー情報を設定します

出力file file_get_contents() メソッド

file_get_contents() は、ファイルの内容を文字列に読み取ります。これは、ファイルをメモリに読み込んでから内容を出力することを意味します

うろ覚えです

このように、ファイルがわずかに大きい限り、それはメモリ制限

4. 出力ファイル file() メソッド

は、file() が内容を配列に 1 行ずつ読み取る点を除き、メモリを必要とします

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() メソッド

readfile() メソッド: ファイルを読み取り、出力バッファに書き込みます

このメソッドは、ファイル全体を使わずにバッファに直接出力できます。メモリを占有しているファイル

前提条件は、最初にバッファをクリアしてそれを許可することです ユーザーにはファイルをダウンロードするためのダイアログボックスが表示されます

$str = file_get_contents($file);echo $str;
ログイン後にコピー

この方法は、メモリ上の理由で失敗することなく、大きなファイルを出力できます。

しかし、readfile() は PHP のメモリ枯渇も引き起こします: http://stackoverflow.com/questions/6627952/why-does-readfile-exhaust-php-memory


PHP はファイルを読み取って出力に書き込む必要がありますしたがって、300MB のファイルの場合、どのような実装を記述したとしても (多数の小さなセグメントごと、または 1 つの大きなチャンクごとに)、PHP は最終的に 300MB のファイルを読み取らなければなりません。

複数のユーザーがファイルをダウンロードする必要がある場合、 (1 つのサーバーでは、ホスティング プロバイダーが各ホスティング ユーザーに与えるメモリを制限します。メモリが限られているため、バッファを使用するのは得策ではありません。)
ファイルをダウンロードするのに直接リンクを使用するのは問題があると思います。大きなファイルに対するより良いアプローチです。


主なアイデア: PHP はすべてのファイルを必要とし、それらをバッファーに出力します。 300M ファイルの場合、PHP は依然として 300M のメモリを読み取る必要があります。したがって、複数のユーザーが同時にダウンロードすると、バッファーもメモリ不足になります。 (間違っていたらご指摘ください)

たとえば、100 人のユーザーがダウンロードしている場合、100*buffer_size のメモリが必要になります

6. 出力ファイルの fopen() メソッド

$f = file($file);while(list($line, $cnt) = each($f)) {   echo $cnt;}
ログイン後にコピー

fopen() は大きなファイルを読み取ることができますコンテンツの一部を読み取るたびに指定できます。大きなファイルを操作する場合にも役立ちます

7. まとめ

PHP を使用してファイルをダウンロードする場合は、シナリオに注意する必要があります。少数の小さなファイルのみをダウンロードする場合は、PHP を使用してダウンロードすることをお勧めします。ただし、PHP が多数のダウンロード要求に耐える必要がある場合は、ファイルのダウンロードを PHP で行うべきではありません。

Apache の場合は、ダウンロード タスクを完了するのに役立つ mod_xsendfile があり、よりシンプルかつ高速です

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート