vue 批量上传文件

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

简单说明一个实现思路:

  1. 前端vue统一处理多个文件保存到formData对象中,请求后台接口
  2. 后台接口使用HttpServletRequest 进行接收,可转化成MultipartHttpServletRequest对象接收前端formData对象
//前端使用的UI组件是Ant Design of Vue的upload组件


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 fileMap = multipartRequest.getFileMap();
        if (fileMap.isEmpty()) {
            return Result.error("上传文件不能为空");
        }
        if (fileMap.size() > 5) {
            return Result.error("批量上传文件数量不能超过5个文件");
        }
        List> 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 fileMap = multipartRequest.getFileMap();

前端参数格式:
vue 批量上传文件_第1张图片

vue 批量上传文件_第2张图片

请求结果:
vue 批量上传文件_第3张图片

你可能感兴趣的:(vue,vue)