700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Vue项目中ElementUI上传文件时携带表单数据进行手动上传

Vue项目中ElementUI上传文件时携带表单数据进行手动上传

时间:2021-12-14 01:36:32

相关推荐

Vue项目中ElementUI上传文件时携带表单数据进行手动上传

ElementUI的Upload组件携带表单数据进行手动上传

项目需求本来是文件单独上传,再提交表单数据,请求两次接口。现在需求有变,要求在触发表单传输事件的同时上传文件,也就是提交表单数据和上传文件同步进行,请求一次接口。

起初是准备使用upload组件自带的http-request来自定义事件,覆盖组件的默认上传行为,但那样需要自己重新创建formData对象之类的,感觉很麻烦,所以弃用了。

elementui中的upload组件上传文件时能附带额外的参数,所以我的思路是把表单数据作为上传时附带的额外参数提交给后台就好了

下面废话不多说,直接上代码了:

<!-- 表单部分的代码这里就不贴出来了,这部分代码也不重要 --><el-uploadref="upload":action="url" :limit="2"multiple:with-credentials="true":on-success="upFile":on-remove="handleRemove":on-exceed="handleExceed":data="upData":auto-upload="false"accept=".KEY, .CRT"><img src="/static/images/web/upload.png" alt><span>选择上传证书</span><div slot="tip" class="el-upload__tip">只能上传.key/.crt文件,且只能上传两个</div></el-upload><!-- 提交表单的事件:add --><el-button type="primary" @click="add('form')">添加</el-button>

data() {return {url: service.defaults.baseURL + "aaa/bbb", // 这里写上传文件的地址form: {ipArea: "",sourceMachineIp: ""}};},computed: {// 这里定义上传文件时携带的参数,即表单数据upData: function() {return {body: this.form}}},methods: {add(form) {this.$refs[form].validate(async valid => {if (valid) {// 表单验证通过后使用组件自带的方法触发上传事件this.$refs.upload.submit()} else {return false;}});},// 成功上传文件upFile(res, file) {if (res.status == 200) {// 文件上传成功后的回调,比如一些提示信息或者页面跳转都写在这里this.$message.success(res.info);} else {this.$message.warning(res.info);let _this = this;setTimeout(function() {_this.$refs.upload.clearFiles();}, 1000);}},// 上传文件超出个数handleExceed(files, fileList) {this.$message.warning(`当前只能选择上传2 个证书`);},// 移除文件handleRemove(res, file, fileList) {this.$message.warning(`移除当前${res.name}证书,请重新选择证书上传!`);}}

此时,当我点击添加按钮触发事件时,发现后台报了一长串的错

检查了一下,发现body携带的参数根本就读不出来,因为文件上传使用的是Content-Type: multipart/form-data;携带参数使用的是FormData格式,这就找到问题所在了,我们需要把表单数据转换一下格式,后台才能接收到。

将body的格式进行转换一下:

此时就能将表单参数和文件同时传给后台了

formData格式下在这里查看上传文件和表单数据的内容

至此,已实现在上传文件的同时提交表单数据的功能。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。