vue上传文件formData上传的解决全流程

 更新时间:2022年06月02日 09:17:10   作者:大明湖畔写代码  
这篇文章主要介绍了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();

前端参数格式:

请求结果:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue解决ajax跨域的问题

    Vue解决ajax跨域的问题

    这篇文章主要介绍了Vue解决ajax跨域的问题,跨域请求:是指协议名、主机名、端口号三者有任何一个不一样,而且跨域请求是请求发出去了,服务器接收并返回了结果,只是浏览器没有接收响应结果。感兴趣的同学可以参考阅读
    2023-04-04
  • 利用Vue3封装一个弹框组件简单吗

    利用Vue3封装一个弹框组件简单吗

    最近在项目中自己封装的一个记录一下,下面这篇文章主要给大家介绍了关于利用Vue3封装一个弹框组件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2021-12-12
  • Vuejs第六篇之Vuejs与form元素实例解析

    Vuejs第六篇之Vuejs与form元素实例解析

    本文通过实例给大家详细介绍了Vuejs与form元素的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • VUE3基于vite封装条形码和二维码组件的详细过程

    VUE3基于vite封装条形码和二维码组件的详细过程

    基础组件开发是项目业务开发的基石, 本文主要介绍了通过vue3的vite脚手架快速搭建项目, 开发条形码和二维码组件的过程,感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • Vue.js 十五分钟入门图文教程

    Vue.js 十五分钟入门图文教程

    不过 Vue 本身含有非常丰富的功能,要用 Vue 搭建完整的应用,仍然需要了解大量 Vue 设计概念和操作技巧。这篇文章主要介绍了Vue.js 十五分钟入门图文教程,需要的朋友可以参考下
    2018-09-09
  • 详解vue v-model

    详解vue v-model

    这篇文章主要介绍了vue v-model的相关资料,帮助大家更好的理解和学习vue,感兴趣的朋友可以了解下
    2020-08-08
  • vue+webpack 打包文件 404 页面空白的解决方法

    vue+webpack 打包文件 404 页面空白的解决方法

    下面小编就为大家分享一篇vue+webpack 打包文件 404 页面空白的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • vue.js移动数组位置,同时更新视图的方法

    vue.js移动数组位置,同时更新视图的方法

    下面小编就为大家分享一篇vue.js移动数组位置,同时更新视图的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • Vue中使用fetch读取本地txt文件的技术实现

    Vue中使用fetch读取本地txt文件的技术实现

    在Vue.js应用开发中,有时我们需要从本地读取文本文件(如 .txt 文件)并将其内容展示在页面上,这种需求在处理配置文件、日志文件或静态数据时非常常见,本文将详细介绍如何在Vue中使用 fetch API 读取本地 .txt 文件,并提供多个示例和使用技巧
    2024-10-10
  • vuex+axios+element-ui实现页面请求loading操作示例

    vuex+axios+element-ui实现页面请求loading操作示例

    这篇文章主要介绍了vuex+axios+element-ui实现页面请求loading操作,结合实例形式分析了vuex+axios+element-ui实现页面请求过程中loading遮罩层相关操作技巧与使用注意事项,需要的朋友可以参考下
    2020-02-02

最新评论