文件上传验证

客户端文件上传校验 通过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服务器端校验
  1. switch ($_FILES['userfile']['error']) {
  2. case UPLOAD_ERR_OK:
  3. $strData = file_get_contents($_FILES[userfile]['tmp_name']);
  4. if (strlen($strData) > 2097152) { // 2M
  5. // 报错:文件超过程序大小限制
  6. }
  7. if (strlen($strData) < 1) {
  8. // 报错:文件为空或者文件不存在
  9. }
  10. break;
  11. case UPLOAD_ERR_INI_SIZE:
  12. case UPLOAD_ERR_FORM_SIZE:
  13. // 报错:文件超过程序大小限制
  14. break;
  15. case UPLOAD_ERR_PARTIAL:
  16. // 报错:文件没有完整上传
  17. break;
  18. case UPLOAD_ERR_NO_FILE:
  19. // 报错:没有上传文件
  20. break;
  21. }
复制代码
以上是服务器端校验的基本框架,其中 $_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参数来判断,如:
…… if ((empty($_FILES) || empty($_POST)) && $_GET['up'] == 1) { // 上传文件过大,超过post限制 } 当用户在input file中输入了一个不存在的文件路径(以盘符+冒号开头,可以提交),提交到服务器端后,switch($_FILES['userfile']['error'])会case到UPLOAD_ERR_OK,$_FILES的其他参数都很正常,就$_FILES['userfile']['size']为0,因此只能用他来判断,且只能判断出文件不存在或文件内容为空(好像不能区分出来)
Joi 是一个 Node.js 模块,用于验证 JavaScript 对象的结构。它提供了一组易于使用的功能来构建强大的验证规则。要实现文件上传验证,可以使用 Joi 的 `file()` 方法来定义文件上传验证规则。 以下是一个示例代码,演示如何使用 Joi 来验证文件上传: ```javascript const Joi = require('joi'); // 定义文件上传验证规则 const fileValidationSchema = Joi.object({ file: Joi.object({ name: Joi.string().required(), size: Joi.number().max(1000000).required(), mimetype: Joi.string().valid('image/png', 'image/jpeg', 'image/jpg').required() }).required() }); // 处理文件上传请求 app.post('/upload', (req, res) => { // 验证上传的文件是否符合规则 const { error } = fileValidationSchema.validate(req.files); if (error) { // 如果文件不符合规则,返回错误信息 res.status(400).send(error.details[0].message); } else { // 如果文件符合规则,上传文件 // ... } }); ``` 以上代码中,`fileValidationSchema` 定义了文件上传验证规则。在 `fileValidationSchema` 中,我们定义了 `file` 对象,包含了文件的名称、大小和 MIME 类型。我们使用 `required()` 方法来指定这些属性是必需的,并使用 `max()` 和 `valid()` 方法来限制文件的大小和 MIME 类型。 在处理文件上传请求时,我们使用 `validate()` 方法来验证上传的文件是否符合规则。如果文件不符合规则,我们返回错误信息;否则,我们将文件上传到服务器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值