vue项目中的上传与文件流下载

需求是实现一个上传文件,然后后端添加上水印,后返回一个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标签,进行下载。这下下载就结束了。

相关推荐
2501_920931705 小时前
React Native鸿蒙跨平台采用ScrollView的horizontal属性实现横向滚动实现特色游戏轮播和分类导航
javascript·react native·react.js·游戏·ecmascript·harmonyos
0思必得06 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
东东5167 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino7 小时前
图片、文件的预览
前端·javascript
2501_920931708 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
layman05289 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔9 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李9 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN9 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒9 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局