vue上傳文件formData上傳的解決全流程

vue上傳文件formData上傳解決

axios實例的配置關鍵配置

FormData 上傳文件類型有變項目中封裝的公共方法需要更改頭部請求信息設置為設為 “multipart/form-data”

整體流程解決跨域上傳文件跨域上傳FormData格式等問題

vue中Dom結構

<input type=“file” @change=“handleUpload” />

上傳圖片更改傳遞到接口事件

const handleUpload = (e) => {
const service = axios.create({
baseURL: ‘/api',
withCredentials: true // cors跨域要讓後臺設置cors跨域需後臺設配合
})
const params = new FormData() // 聲明formData數據類型
params.append(‘file', event.target.files[0])
params.append(‘tp', ‘partImg')
service
.post(‘UploadFiles/UploadImg', params, {
headers: {
‘Content-Type': ‘multipart/form-data'// 修改請求頭
}
})
.then(res => {
// console.log(‘提交成功');
})
}

handleUpload需要在vue3項目中return

baseURL設置為api vue項目中創建vue.config文件並寫入proxy跨域代理vue2和vue3都支持

vue 批量上傳文件

業務背景:一次性批量上傳多個文件,隻請求一次接口,則手動提交到後臺

簡單說明一個實現思路

  • 前端vue統一處理多個文件保存到formData對象中,請求後臺接口
  • 後臺接口使用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();

前端參數格式:

請求結果:

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: