需求是实现一个上传文件,然后后端添加上水印,后返回一个zip我去下载。
第一步:上传
js
<md-tab id="tool" md-label="工具">
<div v-loading="loading">
<el-divider content-position="left">添加水印</el-divider>
<div class="package">
<el-form :inline="true" :model="conversionForm" class="demo-form-inline" :rules="conversionRules" ref="watermarkForm">
<el-form-item label="水印文本" prop="watermark">
<el-input v-model="conversionForm.watermark" placeholder="请输入水印" maxlength="32"></el-input>
</el-form-item>
<el-form-item prop="conversionFile" class="upload-list">
<el-upload action="" multiple :auto-upload="false"
accept=".pdf, .doc, .docx"
:on-change="handleChangeFile" ref="upload">
<el-button size="small" type="primary" slot="trigger">选取文件</el-button>
</el-upload>
</el-form-item>
</el-form>
<el-button type="primary" @click="conversionUpload()">转换</el-button>
</div>
</div>
</md-tab>
js
handleChangeFile(file, fileList) {
this.conversionForm.conversionFile = file.raw
this.conversionForm.list = fileList.map(item => item.raw)
},
结构代码如上,因为我们上传并不是直接上传,所以我们先把auto-upload设置成false,还要增加on-change事件,这样可以拿到我们需要的文件,并且我们上传完成之后我们还要下载,所以我们的接口也要设置一下,我们需要设置responseType为blob,这个我们后面要用。
js
//增加文件水印
export const addFileWatermark = (data) => {
return request({
url: '/estimate/addWaterMark',
method: 'post',
data,
responseType: 'blob'
})
}
接下来看上传阶段
js
let formData = new FormData()
this.conversionForm.list.forEach((file,index) => {
formData.append(`files`,file)
})
formData.append('waterMark', this.conversionForm.watermark)
addFileWatermark(formData)
.then(({filename,blob}) => {
download(blob,filename)
this.loading = false
})
.catch(err => {
console.log(err,'查看');
this.loading = false
})
这个就是上传的主要逻辑,上传就是new 一个formData,然后把file添加进去,虽然是多文件上传,但不能直接把on-change获取的fileList直接填到formData里,需要把fileList里的raw先取出来(这个才是文件)构成一个数组,然后foreach添加到formData里。 第二步:下载
js
export function download(blob, filename) {
const url = URL.createObjectURL(blob)
const opt = {
href: url
}
if (filename) {
opt['download'] = filename
}
createElement('a', opt).click()
URL.revokeObjectURL(url)
}
下载就比较简单,将.then后的参数解构 ,然后拿到文件名以及blob之后通过模拟点击a标签,进行下载。这下下载就结束了。