最近做了两个表单,里面涉及到图片上传,刚开始的时候还是感觉有点慌乱,毕竟是没做过嘛,但是做完了回过头来想想,其实也没什么。
第一次是用了 base64,这样每个图片都是转换成一串代码提交,后来又需要同时上传多个图片,就采用了 FormData 的方式。下面就简单总结一下:
base64:
Base64是一种基于64个ASCII字符来表示二进制数据的表示方法。常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email、在XML中存储复杂数据。
|
下面是一个转换图片到 base64 上传到服务器,获取服务器地址后在页面进行预览的例子。这里需要用到 HTML5 当中的 FileReader 接口。以 Vue 展示:
template 部分代码:
<form enctype="multipart/form-data"> <input type="file" @change="onFileChange">//点击这里上传图片 <p id="b64"></p>//这里展示生成的base64码 <img alt="" :src="base64" id="avatar">//这里展示图片预览 </form>
|
script 部分代码:
export default { data () { return { base64:'' } }, methods: { onFileChange (e) { var files = e.target.files || e.dataTransfer.files; if (!files.length) return; this.createInput(files[0]); }, createInput(file){ var reader = new FileReader(); reader.onload = (e) => { let img_base64=reader.result let data={ img_base64:img_base64 }; this.$ajax.post('url',querystring.stringify(data) ).then(response => { let data=response.data.body; this.base64=data.url;//返回的 url 地址 }, response => { alert("出错啦!") }) } reader.readAsDataURL(file); } } }
|
这样的话会有个问题,用户可能不确定要上传哪个图片,但是都被上传到后台去了,怎么办?解决办法就是让后端返回每张图片的 id,在最后提交表单的时候把 id 也一并提交上去。
注意:
往后台提交base64字符串的时候,里面的加号“+”会被识别成空格,所以需要替换一下,“%2B”是加号的编码
let newBase64 = base64.replace(/\+/g, "%2B");
|
FormData用于通过表单提交同时上传多张图片的情形。
html 代码:
<form enctype="multipart/form-data"> <span>上传驾驶证<i class="file">(最多5张照片)</i></span> <input accept="image/*" type="file" name="licence_image" multiple> <span>上传行驶证<i class="file">(最多5张照片)</i></span> <input accept="image/*" type="file" name="certificate_image" multiple> <span>上传证件照</span> <input accept="image/*" type="file" placeholder="请上传证件照" name="head_icon"> </form>
|
其中 multiple 属性就是表示允许多张图片,数量是在后端进行限制的,前端暂时未找到解决办法,这里只是做个提示。accept 属性可以限制文件类型。
javascript 代码:
var formData = new FormData(document.querySelector("form")); for (var i = 0; i < $("input[name='licence_image']")[0].files.length; i++) { formData.append('licence_image[]', $("input[name='licence_image']")[0].files[i]);//遍历并插入到 licence_image 这个数组里面 } for (var i = 0; i < $("input[name='certificate_image']")[0].files.length; i++) { formData.append('certificate_image[]', $("input[name='certificate_image']")[0].files[i]);//遍历逼格插入到 certificate_image 数组里面 }
|
至于单独的一张图片不用这么处理,只需要在最后提交的时候一起提交即可:
$.ajax({ url:'url', type:'post', contentType: false,//必不可少 processData: false,//必不可少 data: formData//这里包括了所有表单的数据 }).done(function(data){ ... })
|
好了,图片上传的两种方式就简单说完了,其实是不是很简单,只要按照套路来就可以了。