由于涉及到本地和服务器两方面的安全问题,所以基于input type="file"形式的页面文件上传一直处于一个很尴尬的位置。一方面,用户不希望隐私泄露,所以浏览器无法对用户在上传时选择的文件做有效的判 断。另一方面,为了服务器端的安全,减轻传输负担,系统又希望能在用户开始上传之前就将非法的文件拒之门外。
一来一去,基于原始input方式的上传,成为网络存储网站避之唯恐不及的遗留性问题,也造就了现在千奇百怪的插件、上传客户端。
input方式的上传就如此之差么?当然不是。上传文件不大的时候,它还是非常简单可靠的,在PHP中,我们只需要一个复合型表单:
<form enctype="multipart/form-data" action="__URL__" method="POST">
<input name="userfile" type="file" />
move_uploaded_file($_FILES['userfile']['tmp_name'], '/var/www/uploads/'. basename($_FILES['userfile']['name']));
虽然设置方法在手册 中都有比较详细的说明,之所以仍然说此方法不可行,是因为php执行脚本在超过memory_limit时,该次的POST数据会全部丢失并且不会报错!
试想用户填写了一个超长的表单,并伴随一个超过memory_limit的文件一起上传,经过了漫长的等待时间之后发现等来的又是一张干干净净的空白表 单,那是何等印象深刻的用户体验啊。更何况数十M的服务器流量仅仅用来检测文件大小,是现在的网络环境不允许的。
通过Javascript
Javascript是基于浏览器的,虽然JS能完成很多看似不可能的任务,但浏览器做不到的事情JS同样无法做到。先天不足注定了这项工作仅仅靠Javascript是无法胜任的。不过一些IE Only的方法 也还是存在的,仅作参考 。
通过Flash
Flash的FileReference类提供了一套比较全面的文件处理方法,现在大多数大文件上传也都采用了基于Flash的方案。如果利用Flash与Js交互,能否实现客户端对文件大小的检测呢?答案是可行的。
首先在flash文件中实例化FileReference类。
var fr = new FileReference();
基于这个类就可以用Flash提供的file browse和SelectFile事件替代浏览器的事件。我们需要:
1、绑定SelectFile
fr.addEventListener(Event.SELECT, onSelectFile);
2、创建一个供Js访问的对象,用来放置flash得到的文件信息
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文件上传问题有所帮助。
本文向大家介绍php上传文件问题汇总,包括了php上传文件问题汇总的使用技巧和注意事项,需要的朋友参考一下 1.先做个最简单的上传文件 2.然后了解超级全局变量$_FILES的值 其中,$_FILES['userfile']['error']的所有值: UPLOAD_ERR_OK 其值为 0,没有错误发生,文件上传成功。 UPLOAD_ERR_INI_SIZE 其值为 1,上传的文件超过了 php
问题内容: 我有一个允许用户上传视频文件的网站,但我希望将文件大小限制为2MB,这在上传文件后非常简单,但是没有人知道我是否可以 在 上传 之前 检查文件大小,以免超载服务器不必要? 我可能正在寻找javascript / ajax解决方案,但是我不知道如何实现此目的。 任何帮助将非常欢迎。多谢你们! 更新: 我需要在 客户端 而不是在 服务器 端 检查文件大小,这可能吗? 问题答案: 您可以使用
问题 如何限定上传文件的大小? Solution web.py 使用cgi 模块来解析用户的输入, 而 cgi 模块对最大输入大小有限制。 下面的代码限制了最大数据输入为 10MB. import cgi # Maximum input we will accept when REQUEST_METHOD is POST # 0 ==> unlimited input cgi.maxlen =
问题内容: 我有一个无法访问的PC上托管的网站。我有一个上传表单,允许人们上传最大30MB的mp3文件。我的服务器端脚本是用PHP完成的。 每次尝试上传文件时,都会收到一条错误消息,声称文件超出了允许的最大大小,因此我需要增加大小。我在网络上的研究建议更改我无权访问的文件,这样将无法正常工作。其他人建议我将自定义文件添加到我的根目录中,该文件无效。还有其他建议吗? 问题答案: 您需要设置的值,并在
用Flask处理非常大的文件上传(1 GB+)的最佳方式是什么? 我的应用程序基本上接受多个文件,为它们分配一个唯一的文件号,然后根据用户选择的位置将其保存在服务器上。 我们如何运行文件上传作为一个后台任务,这样用户就不会有浏览器旋转1小时,而是可以立即进入下一页? null
本文向大家介绍php上传文件常见问题总结,包括了php上传文件常见问题总结的使用技巧和注意事项,需要的朋友参考一下 把php上传文件时经常碰到的几个问题总结一下吧,以后用到时不用再去找了。 1.先做个最简单的上传文件 2.然后了解超级全局变量$_FILES的值 其中,$_FILES['userfile']['error']的所有值: UPLOAD_ERR_OK 其值为 0,没有错误发生,文件上传成