vue 批量上传文件

业务背景:一次性批量上传多个文件,只请求一次接口,则手动提交到后台

简单说明一个实现思路:

  1. 前端vue统一处理多个文件保存到formData对象中,请求后台接口
  2. 后台接口使用HttpServletRequest 进行接收,可转化成MultipartHttpServletRequest对象接收前端formData对象
//前端使用的UI组件是Ant Design of Vue的upload组件
<template>
  <div class="clearfix">
    <a-upload
      :multiple="true"
      :before-upload="beforeUpload"
      :list-type="listType"
      :file-list="fileList"
      @preview="handlePreview"
      @change="handleChange"
      @download="handleDownload"
    >
      <div v-if="isMore">
        <a-icon type="plus" />
        <div class="ant-upload-text">文件上传</div>
      </div>
      <div v-if="!isMore && fileList.length < 1">
        <a-icon type="plus" />
        <div class="ant-upload-text">文件上传</div>
      </div>
    </a-upload>
    <a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel">
      <img alt="example" style="width: 100%" :src="previewImage" />
    </a-modal>
  </div>
</template>

JS的核心代码:
handleUpload() {
      const { fileList } = this
      if (fileList.length > 0) {
        var notUploaded = []
        var uploaded = []
        fileList.forEach((item) => {
          if (item.status && item.status === 'done') {
            uploaded.push(item.url)
          } else {
            notUploaded.push(item)
          }
        })
        let formData = new FormData()
        notUploaded.forEach((file, index) => {
          //所有文件保存在formData中
          formData.append(`file${index}`, file.originFileObj)
        })
        console.log('formData', JSON.stringify(formData))
        //请求批量上传接口
        batchUploadFile(formData, this.targetS).then((res) => {
          if (res.success) {
            console.log('res', JSON.stringify(res))
          } else {
            this.$message.error('图片上传失败,请重新上传')
          }
        })
        // return
        //this.$emit('loadImgUrl', this.loadImgUrl.join(','))
        //this.fileList = []
      } else {
        // 如果没有图片则返回空
        //this.$emit('loadImgUrl', '')
        //this.fileList = []
      }
    },
后台代码:

    @ApiOperation(value = "批量文件上传(最多同时上传5个文件)", notes = "批量文件上传")
    @PostMapping("/batchUploadFile/{filePath}")
    public Result<?> batchUploadFile(@ApiParam(value = "自定义上传文件的路径")
                                     @PathVariable("filePath") String filePath,
                                     HttpServletRequest request) throws Exception {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
        if (fileMap.isEmpty()) {
            return Result.error("上传文件不能为空");
        }
        if (fileMap.size() > 5) {
            return Result.error("批量上传文件数量不能超过5个文件");
        }
        List<Map<String, Object>> mapList = ftpUtils.batchUploadFile(fileMap, filePath);
        return Result.OK(mapList);
    }

注意:以上代码部分功能不完全只能作为参考,重点是实现思路
1.前端是如何组装参数

  let formData = new FormData()
        notUploaded.forEach((file, index) => {
          //所有文件保存在formData中
          formData.append(`file${index}`, file.originFileObj) //核心代码
        })

2.后台使用MultipartHttpServletRequest对象进行接受

  MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();

前端参数格式:
在这里插入图片描述

在这里插入图片描述

请求结果:
在这里插入图片描述

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 中实现附件批量上传可以使用第三方库,比如 `vue-upload-component`。下面是一个简单的示例代码: 首先,安装 `vue-upload-component`: ```bash npm install vue-upload-component ``` 然后,在你的 Vue 组件中使用该组件: ```vue <template> <div> <vue-upload-component ref="upload" :url="uploadUrl" :multiple="true" @input-file="handleFileUpload" ></vue-upload-component> <button @click="uploadFiles">上传</button> </div> </template> <script> import VueUploadComponent from 'vue-upload-component'; export default { components: { VueUploadComponent, }, data() { return { uploadUrl: '/your-upload-url', files: [], }; }, methods: { handleFileUpload(files) { this.files = files; }, uploadFiles() { // 在这里执行上传逻辑,比如使用 axios 或其他方式发送请求 // 可以遍历 this.files 数组,对每个文件执行上传操作 // 示例中只打印文件名 this.files.forEach((file) => { console.log(file.name); }); }, }, }; </script> ``` 上述示例中,`vue-upload-component` 组件被引入并在模板中使用。通过 `ref` 属性可以获取到该组件的实例。`url` 属性指定上传文件的服务器端接口地址。`multiple` 属性设置为 `true`,允许多文件上传。`@input-file` 事件会在用户选择文件后触发,将选中的文件作为参数传递给 `handleFileUpload` 方法。 `uploadFiles` 方法中可以执行实际的上传操作。这里只是简单地打印了每个文件的文件名,你可以根据具体需求使用适当的方式进行文件上传操作。 请注意将示例代码中的 `/your-upload-url` 替换为真实的上传接口地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值