PHP アップロードの問題の概要 (ファイル サイズの検出、大きなファイルのアップロード)

WBOY
リリース: 2016-06-23 13:15:19
オリジナル
1079 人が閲覧しました

背景: テスターは HTML で一度に 8G ファイルをアップロードすることを提案しましたが、なぜインターフェイスはサイズが制限を超えたことをすぐに返さなかったのでしょうか? 一部のブラウザーではファイル サイズに制限があります。以前にも同様の問題が発生しました。現在、受信側は 1 回限りの Post を使用しており、HTTPBody のコンテンツ長を分析してブラウザーに即座に通知する方法がありません。たとえば、Nginx のサイズを設定し、インターセプト用に PHP でサイズを設定するというこのアイデアは良いですが、アップロードにブレークポイントを使用し、ブラウザのフィルタリングを実行する必要がない限り、現時点では実装できません。 H5 ブラウザを使用すると、サーバーのフィルタリングは 1 回だけ機能します。

ローカルとサーバーの両方の側面にセキュリティ上の問題が含まれるため、input type="file" に基づくページ ファイルのアップロードは常に厄介な状況にありました。一方で、ユーザーは自分のプライバシーが漏洩されることを望んでいないため、ブラウザはアップロード時にユーザーが選択したファイルについて有効な判断を行うことができません。一方、サーバー側のセキュリティと送信負荷の軽減のため、システムはユーザーがアップロードを開始する前に違法なファイルを拒否することを望んでいます。

時間が経つにつれ、元の入力方法に基づいたアップロードは、ネットワーク ストレージ Web サイトが回避するレガシーな問題となり、また、あらゆる種類の奇妙なプラグインやアップロード クライアントも作成されました。

アップロードの入力方法がそんなに悪いのでしょうか?もちろん違います。ファイルのアップロードが大きくない場合でも、PHP では、複合フォームのみが必要です

入力ボックス

そしてサーバー側のコード行

move_uploaded_file($_FILES['userfile']['tmp_name'] , '/var/www/uploads/'.basename($_FILES['userfile']['name']));

でアップロードプロセス全体を実現できます。

しかし、ファイルが大きくなるにつれて、フォームアップロードの欠点が明らかになります。特に、大きすぎるファイルのアップロードを防ぐためにファイル サイズを最小限に抑えるという単純な考えは非常に困難になっています。それらを 1 つずつ見てみましょう:

MAX_FILE_SIZE ごと

マニュアルでよく読みます:

MAX_FILE_SIZE 隠しフィールド (単位はバイト) はファイル入力フィールドの前に配置する必要があり、その値はファイルの最大サイズです。受信したファイル。これはブラウザに対する推奨事項であり、PHP もこれをチェックします。この設定はブラウザ側で簡単にバイパスできるため、この機能を使用して大きなファイルをブロックすることは期待しないでください。実際、PHP 設定の最大アップロード ファイル サイズは期限切れになりません。ただし、この項目をフォームに追加することをお勧めします。これにより、ユーザーが大きなファイルのアップロードを待って時間を費やした後に、ファイルが大きすぎてアップロードに失敗したというトラブルを回避できます。

明らかに、PHP 開発者は大きなファイルのアップロードの問題も考慮していますが、マニュアルにあるように、MAX_FILE_SIZE はブラウザに対する提案にすぎません。実際、これまでのところすべての主流ブラウザはこの提案を採用していないため、MAX_FILE_SIZE を制限して採用されています。ファイルサイズはアレンジメントのようなもので、現実的ではありません。

サーバー側経由

MAX_FILE_SIZE が無効であるため、ユーザーはファイルをサーバーにアップロードできます。サーバー側は $_FILES['userfile'] ['size'] を通じてユーザーがアップロードするファイルのサイズを決定します。そして、アップロードを受け入れて情報を返すかどうかを決定します。サーバーへの負荷と、当面の悪意のある妨害行為の可能性を除けば、このソリューションは帯域幅の無駄以外の何ものでもないように思えます。また、ユーザーによるファイルのアップロードも制限されます。

ただし、PHP ファイルのアップロードは php.ini の次の設定の影響を受けます:

post_max_size

upload_max_filesize

max_execution_time

memory_limit

設定方法はマニュアルに詳しく説明されていますが、その理由はこの方法がまだ実現できない理由は、PHP 実行スクリプトがmemory_limit を超えると、すべての POST データが失われ、エラーが報告されないためです。

ユーザーが非常に長いフォームに記入し、memory_limit を超えるファイルとともにアップロードすると、待っているのは別の空白のフォームであることがわかります。これは非常に印象的なユーザー エクスペリエンスです。 。さらに、数十 MB のサーバー トラフィックはファイル サイズの検出にのみ使用されますが、現在のネットワーク環境では許可されていません。

Javascript を通して

JavaScript はブラウザに基づいていますが、JS は一見不可能に見える多くのタスクを実行できますが、JS はブラウザにできないことは実行できません。固有の欠点により、この作業は Javascript のみで行うことが運命づけられています。ただし、一部の IE Only メソッドはまだ存在しており、参照のみを目的としています。

Flash を通じて

Flash の FileReference クラスは、比較的包括的なファイル処理メソッドのセットを提供するようになり、大部分のファイルのアップロードでも Flash ベースのソリューションが使用されます。 Flash を使用して Js と対話する場合、クライアントはファイル サイズを検出できますか?答えは「はい」です。

まず、フラッシュ ファイルで FileReference クラスをインスタンス化します。

var fr = 新しい FileReference();

このクラスに基づいて、Flash が提供するファイル参照イベントと SelectFile イベントを使用してブラウザ イベントを置き換えることができます。必要なもの:

1. Bind SelectFile

fr.addEventListener(Event.SELECT, onSelectFile);

2. フラッシュによって取得されたファイル情報を配置するためのオブジェクトを作成します

var s = {

size: 0,

name:'',

type:''

}

3. ファイル参照メソッドを作成します

functionbrowseFile():void {

fr.browse();

}

4. SelectFile イベントがトリガーされると、ファイル情報を渡します

function onSelectFile(e:Event):void {

s.size = fr.size;

s.name = fr.name;

s.type = fr .type;

}

5. Jsが呼び出せるようにbrowseFileメソッドを公開します

ExternalInterface.addCallback("browseFile",browseFile);

6. 取得したファイル情報をJs

ExternalInterface.call(" onSelectFile",s);

これで、Js を介してフラッシュによって渡されるファイル サイズ情報を取得できるようになります。具体的な実装については、デモを参照してください。

結論

これでファイルサイズの確認は成功したようですね。しかし、この記事の最終的な結論は、Flash ベースのファイル サイズ検証は依然として実現可能ではないということです。

ファイルサイズ検証の唯一の目的は、アップロードすることです。上のデモでは、検証に成功したファイル名が入力ボックスに表示されることがわかります。アップロードに慣れている学生は、何かが足りないと感じませんか?そう、Flashではファイル名しか取得できませんが、ファイルのフルパスは取得できず、入力によるアップロードにはファイルパスが必須条件となります。そのため、Flash と JS の相互作用を通じてファイル サイズを正常に検証できますが、後でアップロードする場合は、Flash を使用し続けることしかできません。

Flash 開発ではセキュリティ上の理由からファイルのフル パスがブロックされることは理解できますが、ファイルのアップロード、特に PHP 環境でのファイル検証アップロード ソリューションにはまだ最適なソリューションがありません。

もちろん、それを補う方法はたくさんあります:

Perl ベースのプロジェクト FileChucker、

しかし、結局のところ、いつか HTML のみに基づいた厳密で堅牢なアップロード ソリューションが登場することを願っています。その日がそう遠くないことを願っています。

最後が今回のコードダウンロードです。

出典: http://blog.sina.com.cn/s/blog_460136b40100txyx.html

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