最新发现之前项目里用的 js 上传插件有点点问题 就是上传同一张图片会报错图片限制的类型错误 不知道是不是自己参数什么没设置对 然后想到了使用input
标签中的type=file
这种原生的上传 写下分享下
传统的上传
比如我们在正常的form
表单中需要上传一张图片 一般不使用插件之类的常用做法就是先设置form属性 enctype ="multipart/form-data"
最后提交form表单 然后后天那边自己写处理接受存储啥的 但是这样做会直接刷新页面 很多时候我们不希望提交页面这种 一般都会想到ajax
之类 当然也有别的方法吧 小弟学渣
Ajax上传
使用ajax上传时 需要把要提交的数据组成key=>value
的形式 但是文件流就比较麻烦了 他不能被转换成字符之类 即使你使用serialize
也不能把文件流序列化 然后传送到后端 不过没关系 有个 FormData
的玩意可以帮助我们在 ajax 中提交文件流
FormData 简介
The FormData interface provides a way to easily construct a set of key/value pairs representing form fields and their values, which can then be easily sent using the XMLHttpRequest.send() method. It uses the same format a form would use if the encoding type were set to “multipart/form-data”.
大概就是说 FormData 接口提供了一种很方便的方法去构建表单中的 属性=>值 的这种键值对结构 另外他还可以使用 XMLHttpRequest.send() 来发送异步请求 如果设置了 multipart/form-data 还可以使用和form表单一样的格式化(渣渣英文翻译水平勿喷!!!)
|
|
其实我用append()
2个参数的也可以提交file
第二个参数直接传递 file 对象就可以了
具体参考 MDN 这里有详细的介绍 包括浏览器的兼容情况等等
通过Ajax使用FormData实现上传图片
html:
|
|
我做了一个lable-for的绑定 不用学我
js:
|
|
上面的ajax中需要注意几个参数
1.processData 设置为false 表示对formdata对象不做处理
2.cache设置为false 表示上传文件不需要缓存
3.contentType设置为false 表示表示不设置该值
然后后台接受处理就好了 因为我上面的formData中设置的名字是file所以后台接受了一个file的变量名 我使用的是PHP
|
|
仅供参考