ホームページ > バックエンド開発 > PHPの問題 > phpでファイルをダウンロードする方法【まとめ】

phpでファイルをダウンロードする方法【まとめ】

藏色散人
リリース: 2023-03-04 17:34:01
オリジナル
8825 人が閲覧しました

php でファイルをダウンロードする方法: 1. "$_GET['file']" からファイル パスを取得します; 2. ヘッダー情報を設定します; 3. "file_get_contents()" と "file( )" メソッド; 4. "readfile" メソッドと "fopen" メソッドを通じて。

phpでファイルをダウンロードする方法【まとめ】

# 推奨: 「

PHP ビデオ チュートリアル

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

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

$_GET['file']

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

からファイル パスを取得します。パスを取得するには、必ず上記の方法を使用してください。文字列を連結するだけでパスを取得できます。

$mypath = '/mysecretpath/' . $_GET['file'];
ログイン後にコピー

入力が ../../ の場合、任意のパスにアクセスできます

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

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()返回的结果可能不正确
ログイン後にコピー

3 . 出力ファイル file_get_contents() メソッド

file_get_contents() は、ファイルの内容を文字列に読み取ります、つまり、ファイルをメモリに読み取り、内容を出力します

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

このように、ファイルが少し大きい限り、メモリ制限を超えます

4. 出力 file

の file() メソッドは file_get_contents() と似ていますが、file() が内容を 1 行ずつ配列に格納し、メモリを占有する必要もあります

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

ファイルが大きい場合、メモリ制限を超えます

5. 出力ファイルの Readfile() メソッド

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

このメソッドは、ファイル全体がメモリを占有することなく、バッファに直接出力できます。

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

while (ob_get_level()) ob_end_clean();
//设置完header以后
ob_clean();
flush();  //清空缓冲区
readfile($file);
ログイン後にコピー

このメソッドは大きなファイルを出力することができ、次の状況を除いて 1 つのファイルの読み取りがメモリ制限を超えることはありません。

readfile() は、複数の人がファイルを読み取る場合にも PHP メモリの枯渇を引き起こします: http://stackoverflow.com/questions/6627952/why-does-readfile-exhaust-php-memory

PHP はファイルを読み取って出力バッファに書き込む必要があるため、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 サイトの他の関連記事を参照してください。

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