ローカルとサーバーの両方の側面に関係するセキュリティ上の問題により、input type="file" に基づくページ ファイルのアップロードは常に非常に困難でした。難しい状況。一方で、ユーザーは自分のプライバシーが漏洩されることを望んでいないため、ブラウザはアップロード時にユーザーが選択したファイルについて有効な判断を行うことができません。一方、サーバー側のセキュリティと送信負荷の軽減のため、システムはユーザーがアップロードを開始する前に違法なファイルを拒否することを望んでいます。
時間が経つにつれて、元の入力方法に基づいたアップロードは、ネットワーク ストレージ Web サイトが回避する従来の問題となり、また、あらゆる種類の奇妙なプラグインやアップロード クライアントも作成されました。
アップロードの入力方法が悪いのでしょうか?もちろん違います。ファイルのアップロードが大きくない場合でも、PHP では、複合フォームのみが必要です: コードをコピー コードは次のとおりです: 0a51c6495ded2781f478ca6ccab908b8
入力ボックス: コードをコピーします コードは次のとおりです:4a45a9d2971658990ef1dcb1c46a8bc7
そしてサーバー側のコード行: コードをコピー コードは次のとおりです: move_uploaded_file($_FILES['userfile']['tmp_name'], '/var/www/uploads/'.basename( $_FILES['ユーザーファイル'][ '名前']));
アップロードプロセス全体を実現できます。
しかし、ファイルが大きくなるにつれて、フォームアップロードの欠点が明らかになります。特に、大きすぎるファイルのアップロードを防ぐためにファイル サイズを最小限に抑えるという単純な考えは非常に困難になっています。一つずつ見ていきましょう:
MAX_FILE_SIZEを渡す
MAX_FILE_SIZE 隠しフィールド (単位: バイト) はファイル入力フィールドの前に配置する必要があり、その値は受信したファイルの最大サイズです。これはブラウザに対する推奨事項であり、PHP もこれをチェックします。この設定はブラウザ側で簡単にバイパスできるため、この機能を使用して大きなファイルをブロックすることは期待しないでください。実際、PHP 設定の最大アップロード ファイル サイズは期限切れになりません。ただし、この項目をフォームに追加することをお勧めします。これにより、ユーザーが大きなファイルのアップロードを待って時間を費やした後に、ファイルが大きすぎてアップロードに失敗したというトラブルを回避できます。
明らかに、PHP 開発者は大きなファイルのアップロードの問題も考慮していますが、マニュアルにあるように、MAX_FILE_SIZE はブラウザーに対する提案にすぎません。実際、これまでのところすべての主流ブラウザーはこの提案を採用していないため、ファイル サイズには MAX_FILE_SIZE 制約が採用されています。は単なる飾りのようなものであり、現実的ではありません。
サーバーサイド経由
MAX_FILE_SIZE が無効であるため、ユーザーはファイルをサーバーにアップロードできます。サーバーは $_FILES['userfile']['size'] を通じてユーザーがアップロードしたファイルのサイズを決定し、そのファイルを受け入れるかどうかを決定します。情報をアップロードして返します。サーバーへの負荷と、当面の悪意のある妨害行為の可能性を除けば、このソリューションは帯域幅の無駄以外の何物でもないように思えます。また、ユーザーによるファイルのアップロードも制限されます。
ただし、これも実行不可能です。PHP ファイルのアップロードは、php.ini の次の設定の影響を受けます。
ユーザーが非常に長いフォームに記入し、memory_limit を超えるファイルとともにアップロードすると、長い待ち時間の後、待っているのは別のきれいな空白のフォームであることがわかります。これは非常に印象的なユーザー エクスペリエンスです。ああ。さらに、数十 MB のサーバー トラフィックはファイル サイズの検出にのみ使用されますが、現在のネットワーク環境では許可されていません。
JavaScript経由
JavaScript はブラウザーをベースとしていますが、JS は一見不可能に見える多くのタスクを実行できますが、ブラウザーにできないことは JS では実行できません。固有の欠点により、この作業は Javascript のみで行うことが運命づけられています。ただし、一部の IE Only メソッドは参照目的でまだ存在します。
フラッシュ経由
Flash の FileReference クラスは、比較的包括的なファイル処理メソッドのセットを提供しており、大規模なファイルのアップロードのほとんどで Flash ベースのソリューションが使用されるようになりました。 Flash を使用して Js と対話する場合、クライアントはファイル サイズを検出できますか?答えは「はい」です。
まず、フラッシュ ファイルで FileReference クラスをインスタンス化します。
リーリー
1.選択ファイルをバインドする
リーリー
2. Flashで取得したファイル情報を配置するJsでアクセス可能なオブジェクトを作成します
var s = { size:0, name:'', type:'' }
3、创建file browse方法
function browseFile():void {<br> fr.browse();<br> }
4、当SelectFile事件触发的时候,传递文件信息
function onSelectFile(e:Event):void {<br> s.size = fr.size;<br> s.name = fr.name;<br> s.type = fr.type;<br> }
5、将browseFile方法公开可供Js调用
ExternalInterface.addCallback("browseFile", browseFile);
6、将得到的文件信息传递给Js
ExternalInterface.call("onSelectFile",s);
现在我们已经可以通过Js获得由flash传递来的文件大小信息了,具体的实现可以参看Demo 。
结论
问题至此似乎已经得到解决了,我们已经成功的校验了文件大小不是么。但本文的最终结论是,基于Flash的文件大小校验,仍然不可行。
文件大小校验的唯一目的,是为了上传。在上面的Demo中可以看到校验成功的文件名会显示在一个输入框里。熟悉上传的同学不觉得少了什么吗?没错,通过 flash只能得到文件名,而无法得到文件的完整路径,而文件路径却是input方式上传的必要条件。所以虽然可以成功的通过Flash与Js交互校验文 件大小,但我们能做到的也仅仅只是校验而已,之后想要上传,唯有继续通过flash方式进行。
Flash开发出于安全考虑屏蔽了文件的完整路径这无可厚非,不过文件上传,尤其是PHP环境下的文件校验上传方案仍然没有得到最好的解决。
当然弥补的方法有很多:
基于Perl的项目 FileChucker , XUpload , Uber-Uploader
基于Flash的项目 SWFUpload
还有筒子用PHP直接 在服务器华丽的建立socket链接
但终究我希望有一天能看到仅基于HTML就能实现的严整健壮的上传方案,但愿这一天不会太远。
最后是本次的代码下载 。
php文件上传大小设置详解
用php上传文件,问题最多的就是上传大体积文件时出现错误。 这就涉及到php的配置文件——php.ini
在此配置文件中,有这么几个值是跟文件上传有密切关系的:
如果你上传的文件体积在8m一下(通常情况),那修改以上设置就可以满足你的要求了。
但要>8m,那除了上面几个值,还要特别关注另外两个值了:
试着把这两个值改大些。一般就可以解决大多数问题了。
就此推断,上传文件的体积是可以无穷大的。但还要考虑你的网络情况,等等。
在php.net上,有人说按照这个方法改了后,大于100m的文件还是会出错,不知道是不是PHP本身的问题了。
问题就先为大家介绍到这,希望对大家解决PHP文件上传问题有所帮助。