formData手动上传问题前端如何传递后端如何接收

这篇具有很好参考价值的文章主要介绍了formData手动上传问题前端如何传递后端如何接收。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一. 前言

参考文章:
解决Current request is not a multipart request
axios上传文件错误:Current request is not a multipart reques


二. 问题描述

之前使用el-upload使用默认action表单提交.前端默认content-type为multipart/form-data.没有问题. 后期渐进式优化.修改为axios+formdata传递内容.

Current request is not a multipart request
这个错误是因为后端读取MultipartFile 类型数据时,对申请头的类型进行了一个判断,他只识别 multipart 开头的 Content-Type。所以我们需要修改headers 的 Content-Type。但是手动添加headers会产生第二个错误。所以建议使用formdata 的方式.
参数为formdata 时,浏览器会自动添加一个标准的headers。
后台接受formdata,Java体系,前端,vue.js,javascript
后台接受formdata,Java体系,前端,vue.js,javascript
上传代码
后台接受formdata,Java体系,前端,vue.js,javascript

提交post封装请求
后台接受formdata,Java体系,前端,vue.js,javascript

三.前端正确解决方式

前端上传文件总共有两种方式.通过axios-formData和axios传递.
axios可以通过序列化纯字符串传递.但是缺乏这样的经验.后端接收比较麻烦.因此推荐axios-formData

          <el-form-item label="上传简历">
            <el-upload
                ref="recruitRef"
                class="upload-demo"
                drag
                action="#"
                :auto-upload="false"
                :on-change="handleChange"
                limit="1"
            >
              <el-icon class="el-icon--upload">
                <upload-filled/>
              </el-icon>
              <div class="el-upload__text">
                拖拽 或 <em>点击上传</em>
              </div>
              <template #tip>
                <div class="el-upload__tip">
                  .pdf 文件大小 ≤ 500kb
                </div>
              </template>
            </el-upload>
          </el-form-item>

      <el-form-item>
        <el-button type="primary" @click="postResumeForm()">投递</el-button>
      </el-form-item>
const resumeForm = reactive({
  name: '',
  phone: '',
  email: '',
  experience: '',
  education: '',
  position: router.currentRoute.value.params.position
})

const recruitRef = ref()

let formData = new FormData()

function handleChange(uploadFile, uploadFiles) {
  if (!verifyBeforeUpload(uploadFile)) {
    removeFile()
    return
  }
  formData.append("file", uploadFile)
}

function removeFile() {
  if (recruitRef.value) {
    formData = new FormData()
    recruitRef.value.clearFiles()
  }
}

export const ACCEPTED_EXTENSIONS = ['pdf'];

// 单文件大小校验
function verifyFileSize(file) {
    if (file) {
        let fileSize = file.size;
        let fileMaxSize = 1024 * 500;//500kb
        if (fileSize > fileMaxSize) {
            ElMessage.error("文件不能大于500kb!");
            file.value = "";
            return false;
        } else if (fileSize <= 0) {
            ElMessage.error("文件不能为0kb!");
            file.value = "";
            return false;
        }
        return true
    }
    ElMessage.error("必须传递文件!")
    return false;

}

// 校验文件格式和大小
export function verifyBeforeUpload(file) {
    // 格式
    const extension = file.name.split('.').pop().toLowerCase();
    console.log(extension)
    if (!ACCEPTED_EXTENSIONS.includes(extension)) {
        ElMessage.error('仅支持 pdf 格式的文件');
        return false;
    }
    // 大小
    return verifyFileSize(file);
}


function postResumeForm() {
  ElMessageBox.confirm('确认提交?提交后仅能修改一次', '提示', {
    confirmButtonText: "确定",
    cancelButtonText: "取消",
    type: "warning"
  }).then(async () => {
    if (formData === null || formData === undefined) {
      ElMessage.info("必须递交简历信息!")
      return
    }
    for (let key in resumeForm) {
      formData.append(key,resumeForm[key])
    }
    let res = await reqPostResumeForm(formData)
    if (res.code !== 200) {
      ElMessage.error("简历投递失败")
      return
    }
    await ElMessageBox.alert("简历投递成功! 3-7个工作日内,您将收到回复", '提示', {
      confirmButtonText: "确认"
    })
    removeFile()
  }).catch((err) => {
    console.log(err)
    ElMessage.info("简历投递已取消!")
  })
}

export function postFiles(url,data={}){
    return axios({
        method: "POST",
        url: 'http://127.0.0.1:8080'+url,
        transformRequest: [function(data, headers) {
            // 去除post请求默认的Content-Type
            delete headers['Content-Type']
            return data
        }],
        data: data,
    })
}

后台接受formdata,Java体系,前端,vue.js,javascript
后台接受formdata,Java体系,前端,vue.js,javascript


四. 后端接收代码

 @PostMapping("/uploadBatchTaxRevenue")
    public ResponseResult uploadBatchTaxRevenu(@RequestParam("file") MultipartFile[] files) throws IOException {
        if (files.length == 0) {
            return ResponseResult.okResult(403, "上传文件不能为空!");
        }
        for (MultipartFile file : files) {
            System.out.println(file.getName());
            EasyExcel.read(file.getInputStream(), TaxRevenue.class, new TaxRevenueDataListener(taxRevenueService))
                    .sheet()
                    .doRead();
        }
        return ResponseResult.okResult(200, "上传成功");
    }

后台接受formdata,Java体系,前端,vue.js,javascript文章来源地址https://www.toymoban.com/news/detail-780138.html

到了这里,关于formData手动上传问题前端如何传递后端如何接收的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端传递Json格式,后端如何用多种方式接收

     一、先定义一个简单的实体类 二、编写前端传递的json数据 1.前端传递普通json,后端用对象接收 2.前端传递json数组, 3.前端传递json数组,后端用集合接收Josn数组

    2024年02月12日
    浏览(50)
  • FormData异步发送文件,后端SpringBoot接收

    平时我们用表单提交数据时,所有的数据都是以键值对的形式提交给后端的,对于文件二进制流数据也是以键值对提交的,只是说此时值的内容是二进制数据罢了。如果我们想给后端上传文件,一般都是利用表单里的File控件去提交的,但这时候有一个问题,这种上传方式不是

    2024年02月15日
    浏览(48)
  • kotlin如何接收前端传递过来的数据

    Kotlin 可以使用 Spring Boot 等框架来接收前端传递过来的数据。 在 Spring Boot 中,你可以使用 @RequestBody 注解来将前端传递的 JSON 格式数据转换为相应的 Kotlin 对象。 示例代码: 在上面的示例中, @RequestBody 注解会将前端传递的 JSON 数据转换为 User 对象。你可以在该方法中对数据

    2024年02月10日
    浏览(44)
  • 前端vue elementUI upload上传组件封装&多文件上传&进度条,后端servlet request.getPart()接收文件信息

    选中多个文件上传 通过 axios请求 onUploadProgress 方法监听 on-progress on-success 用这两个钩子函数实现进度条 下面有对应的函数。 本文是每个文件一个请求上传 也可以用一个请求上传多个文件,需要将文件遍历添加到 form 表单中,后端用 request.getParts(); 获取集合,有需要的可以改

    2024年02月11日
    浏览(57)
  • 微信小程序post传递参数为formData格式,一般是在上传图片时需要的

    wx.uploadFile传参的格式本身就是formData格式的,参照官网就可以 如果是wx.request的需要formData格式,如下图data的格式

    2024年02月13日
    浏览(53)
  • 前端接收后端数据时,遇到精度丢失的问题

    之前项目开发过程中遇到过前端接收后端数据时,遇到精度丢失的问题。当时进行了问题记录,本篇博客针对于这个问题进行问题原因并进行多种方式解决这个问题。 前端接收后端返回的数据时出现精度丢失问题,通常是因为在数据传输过程中,数据类型被转换为了 JavaScr

    2024年02月02日
    浏览(69)
  • 前端如何传递Array、Map类型数据到后端

    针对前后端分离的项目,避免不了前端需要传递Array、Map类型的数据到后端,那么要怎么实现这种情况的参数传递呢?请看下文分说。 前端有Map类型数据如下: 将Map类型数据转化成String,再进行传递 将前端传过来的String数据,解析为JSON对象,再强制转为java的Map 以上。本文

    2024年02月02日
    浏览(68)
  • 前端接收后端传的文件流并下载解决乱码问题

    两种情况: 1.如果这个接口是get的请求: 后端返回文件流,前端可能会导出txt或者excel的时候,里面的中文会出现乱码 就可以直接通过以下方式直接下载: window.location.href = \\\"请求文件流的接口地址\\\" 2.如果这个接口是post的请求:         因为存在多种场景,可能需要通过

    2024年02月11日
    浏览(47)
  • 从前端到后端:如何在 URL 参数中传递 JSON 数据

    在 Web 开发中,我们经常需要将数据作为 URL 参数进行传递。当我们需要传递复杂的数据结构时,如何在前端将其转换为字符串,并在后端正确地解析它呢?本文将介绍如何在前端将 JSON 数据进行 URL 编码,并在后端将其解析为相应的数据类型,同时提供 Java 语言的示例代码。

    2024年02月07日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包