基于Vue、Element-ui,封装组件为例子聊聊如何实现这个功能。其它组件实现方式思路一样的!
1. 云储存方式
常见的有七牛云,OSS(阿里云)等,这些云平台提供API接口,调用相应的接口,文件上传后会返回图片存储在服务器上的路径,前端获得这个路径保存下来提交给后端即可。流程很简单。
主要步骤:
- 向后端发送请求,获取oss配置数据
- 文件上传后,调用oss提供接口。
- 文件上传完成,文件储存在服务器相关路径
- 以接口的形式将返回的路径字段返回给前端,存到表单对象中。
代码
视图层代码
<el-upload class="avatar-uploader" action="noAction" :headers="{ 'Content-Type': 'application/x-www-form-urlencoded' }" :show-file-list="false" :on-success="handleAvatarSuccess" :http-request="fileRequestBackId" :before-upload="beforeAvatarUpload"> <img v-if="query.authenticationInfo.backId" :src="query.authenticationInfo.backId" class="avatar"> <div v-else class="avatar-uploader"> <i class="el-icon-plus avatar-uploader-icon"></i> <span class="addText">上传身份证</span> </div> </el-upload>
elementUI的上传组件,http-request方法: 覆盖默认的上传行为,可以自定义上传的实现。
formData是ajax2.0(XMLHttpRequest Level2)新提出的接口,利用FormData对象可以将form表单元素的name与value进行组合,实现表单数据的序列化,从而介绍表单元素的拼接,提高工作效 率。
const params = new FormData() //创建FormData params.append('file', item.file) uploadFileToSecretOss(params).then(res => { if (res.data.code === '0') {
// 拿到返回的上传路径,res.data.uploadUrl, 去提交表单
// doSomethings
} else {}
})
},