客户端文件上传校验 通过JS,浏览器对文件上传的校验只能做很少的事情,只能从字面上判断文件后缀名是否合法,或判断是否满足某文件名规则,不能判断文件是否存在或文件大小。JS可以调FileSystemObject这个AX控件访问文件系统,但只有IE系列的支持,且都有安全提示,或者直接被禁止掉。 且input file控件有个不好的地方,他会去检查你输入的(或选择)文件路径是否满足这个正则表达式:"/^.:/",即必须以windows的盘符开头,且紧接着冒号(C: Z: 1: $: *: 这些都可以),如不满足这个条件form直接提交不了,并不给出任何提示,不是很友好。如图,输入guide.html点提交是没有任何反应的。不知大家能否想出什么好办法。 [img width=300]http://iecom.baidu.com/uploads/newbb/1_47c91a91eabcd.gif[/img] 其实只要通过JS给guide.html前加上C:/就可以提交了,这样就可以到服务器端去验证文件是否存在,但fileUpload.value属性是只读的,也没办法。 如果上传的是图片就好办了,可以利用浏览器的Image对象操作图片(好像FireFox不支持,
百度
空间上的图片上传就是按照IE和FireFox分开做的),检查图片是否存在,图片格式是否正确,图片大小等,还可以做预览。具体JS代码网上到处都是。 还可以用FLASH做文件上传,可以做出非常炫的效果,比如进度条等,一个示例:http://em-dev01.baidu.com:2241/flashUpload/sample.html 2.PHP服务器端校验
以上是服务器端校验的基本框架,其中 $_FILES['userfile']['name'] 客户端机器文件的原名称。 $_FILES['userfile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。 $_FILES['userfile']['size'] 已上传文件的大小,单位为字节。 $_FILES['userfile']['tmp_name'] 文件被上传后在服务端储存的临时文件名。 $_FILES['userfile']['error'] 其中$_FILES['userfile']['error']为: UPLOAD_ERR_OK: value为0,上传成功没错误 UPLOAD_ERR_INI_SIZE: value为1,上传文件超过php.ini中upload_max_filesize限制 UPLOAD_ERR_FORM_SIZE: value为2,上传文件超过提交的FORM中的MAX_FILE_SIZE变量限制 UPLOAD_ERR_PARTIAL: value为3,文件没有完整上传 UPLOAD_ERR_NO_FILE: value为4,没有文件上传 UPLOAD_ERR_NO_TMP_DIR: value为6,没找到临时目录 UPLOAD_ERR_CANT_WRITE: value为7,磁盘不能写 3.文件大小的校验 应用程序校验:在上传文件的form中添加一个隐藏域
此大小会在UPLOAD_ERR_FORM_SIZE错误中进行校验,value的单位是字节。为保险还可以在PHP读上传临时文件时读取文件大小进行检查。 php.ini中upload_max_filesize设置,默认2M吧。 php.ini中post_max_size设置,默认8M吧。这个配置设置post包大小,上传文件肯定不能大于此值,否则POST包被清空,$_POST和$_FILES都会被清空,但$_GET仍然存在。 php.ini中memory_limit设置,默认8M吧。一个php脚本能使用的最大内存值吧。 正常情况下:memory_limit >= post_max_size > upload_max_filesize > 应用程序校验。 4.大小校验中常见问题 当用户上传一个大文件时,会等待很久,等文件全部上传完毕后PHP才会开始校验,不知道有没有什么好的解决方法。当文件大小超过或接近post_max_size大小时,$_POST和$_FILES都会被清空,因此我们需要判断到底是上传文件过大还是根本就没有POST文件上传。虽然$_POST被清空了,但$_GET还存在,因此可以在form的action中添加一个get参数来判断,如:
文件上传验证
最新推荐文章于 2023-07-17 08:00:00 发布