PHP は私にとってより便利なプログラミングをもたらしてくれましたが、使用中に問題が発生する可能性があります。PHP で大きなファイルをアップロードする際の小さな問題について話しましょう。ローカルとサーバーの両方の側面にセキュリティ上の問題が含まれるため、input type="file" に基づくページ ファイルのアップロードは常に厄介な状況にありました。一方で、ユーザーは自分のプライバシーが漏洩されることを望んでいないため、ブラウザはアップロード時にユーザーが選択したファイルについて有効な判断を行うことができません。一方、サーバー側のセキュリティと送信負荷の軽減のため、システムはユーザーがアップロードを開始する前に違法なファイルを拒否することを望んでいます。
時間が経つにつれて、元の入力方法に基づいたアップロードは、ネットワーク ストレージ Web サイトが回避するレガシーな問題となり、また、あらゆる種類の奇妙なプラグインやアップロード クライアントも作成されました。アップロードの入力方法が悪いのでしょうか?もちろん違います。ファイルのアップロードが大きくない場合でも、PHP では複合フォームのみが必要であり、非常にシンプルで信頼性があります。
<ol class="dp-xml"> <li class="alt"> <span><strong><font color="#006699"><span class="tag"><</SPAN><SPAN class=tag-name>form</SPAN></FONT></STRONG><SPAN> </SPAN><SPAN class=attribute><FONT color=#ff0000>enctype</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>"multipart/form-data"</FONT></SPAN><SPAN> </SPAN><SPAN class=attribute><FONT color=#ff0000>action</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>"__URL__"</FONT></SPAN><SPAN> </SPAN><SPAN class=attribute><FONT color=#ff0000>method</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>"POST"</FONT></SPAN><SPAN class=tag><STRONG><FONT color=#006699>></span></font></strong></span><span> </span> </li> <li class=""><span>一个输入框 </span></li> <li class="alt"> <span></span><strong><font color="#006699"><span class="tag"><</SPAN><SPAN class=tag-name>input</SPAN></FONT></STRONG><SPAN> </SPAN><SPAN class=attribute><FONT color=#ff0000>name</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>"userfile"</FONT></SPAN><SPAN> </SPAN><SPAN class=attribute><FONT color=#ff0000>type</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>"file"</FONT></SPAN><SPAN> </SPAN><SPAN class=tag><STRONG><FONT color=#006699>/></span></font></strong><span> </span> </li> <li class=""><span>和服务器端的一行代码 </span></li> <li class="alt"><span>move_uploaded_file($_FILES['userfile']['tmp_name'], '/var/www/uploads/'. basename($_FILES['userfile']['name'])); </span></li> </ol>
はアップロードプロセス全体を実現できます。しかし、ファイルが大きくなるにつれて、フォームアップロードの欠点が明らかになります。特に、PHP が大きなファイルをアップロードしないように最小ファイル サイズを取得するという単純な考えは非常に困難になっています。 1 つずつ見ていきましょう。MAX_FILE_SIZ を渡します。マニュアルにはよく書かれています:
明らかに、PHP 開発者は、PHP による大きなファイルのアップロードの問題も考慮していますが、マニュアルにあるように、MAX_FILE_SIZE はブラウザーに対する提案にすぎません。実際、すべての主流ブラウザーはこれまでのところこの提案を採用していないため、MAX_FILE_SIZE を使用してファイルのサイズを制限しています。ファイルサイズは単なる飾りのようなもので、現実的ではありません。
サーバー側経由
MAX_FILE_SIZE が無効であるため、サーバー側はユーザーがアップロードしたファイルのサイズを $_FILES['userfile']['size' を通じて判断します。 ] を選択し、アップロードを受け入れるかどうかを決定し、メッセージを返します。サーバーへの負荷と、当面の悪意のある妨害行為の可能性を除けば、このソリューションは帯域幅の無駄以外の何物でもないように思えます。また、ユーザーによるファイルのアップロードも制限されます。ただし、これも不可能です。PHP ファイルのアップロードは、php.ini の次の設定の影響を受けます。
<ol class="dp-xml"> <li class="alt"><span><span>post_max_size </span></span></li> <li class=""><span>upload_max_filesize </span></li> <li class="alt"><span>max_execution_time </span></li> <li class=""><span>memory_limit </span></li> </ol>
設定方法はマニュアルに詳しく説明されていますが、この方法がまだ実行できない理由は、PHP が実行されるときです。スクリプトがmemory_limitを超えると、すべてのPOSTデータが失われ、エラーは報告されません。ユーザーが非常に長いフォームに記入し、memory_limit を超えるファイルとともにアップロードすると、長い待ち時間の後、待っているのは別のきれいな空白のフォームであることがわかります。これは非常に印象的なユーザー エクスペリエンスです。ああ。さらに、数十 MB のサーバー トラフィックはファイル サイズの検出にのみ使用されますが、現在のネットワーク環境では許可されていません。