PHPでファイルをダウンロードする方法
PHP でファイルをダウンロードする方法
1. ファイル パスを取得します
$_GET['file'] からファイル パスを取得します
$path_parts = pathinfo($_GET['file']);$file_name = $path_parts['basename'];$file_path = '/mysecretpath/' . $file_name;
パスを取得するには必ず上記のメソッドを使用してください。単純に文字列を連結して取得することはできませんパス
$mypath = ' /mysecretpath/' . $_GET['file'];
入力が ../../ の場合、任意のパスにアクセスできます
出力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
ファイルをダウンロードするのに直接リンクを使用するのは問題があると思います。大きなファイルに対するより良いアプローチです。複数のユーザーがファイルをダウンロードする必要がある場合、 (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 があり、よりシンプルかつ高速です

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。
