axios上传文件接收不到,vue使用axios 发送post请求的四种方法

  axios上传文件接收不到,vue使用axios 发送post请求的四种方法

  本文主要介绍如何使用axios发送post请求上传文件到后端(multipart/form-data)。本文为您带来了问题的原因和解决方案。它用一个示例代码非常详细地介绍给你。有需要的朋友可以参考一下。

  

目录

  项目场景:问题描述原因分析:解决方案:

  

项目场景:

  后端:实现了一个文件上传服务接口,可以从前端接收多文件文件,并本地存储在服务器中。前端:用type file获取font标签中的文件,使用axioshttp请求库,发送post请求,将文件发送到后端。

  

问题描述

  在js中发送上传文件请求的一般代码如下:

  新的FormData对象,它使用append方法向表单添加文件。FormData在js中专门用于发送多部分/表单数据格式请求。append方法的关键是形式上的name属性,即参数名async handleUploadFile(event) {

  const file=event . target . files[0]

  假设formData=新表单数据()

  formData.append(files ,file)

  const res=await service({

  URL:“/API/files/upload”,

  方法: POST ,

  标题:{

  “内容类型”:“多部分/形式数据”

  },

  数据:表单数据

  })

  console . log(RES . data);

  }

  当您实际运行上面的代码时,您会发现后端报告500错误如下:

  原因:java.io.IOException:

  请求被拒绝,因为没有找到多部分边界

  大概是指后端无法识别传输文件中的边界,所以无法分辨一个文件的内容在消息中的起止位置,最终导致文件上传失败。

  

原因分析:

  出现上述情况的原因是,当我发送请求时,我将请求头中的Content-Type属性写入multipart/form-data,浏览器无法自动给我们的报文添加boundary

  我尝试从前端请求配置中删除标头配置,如下所示:

  异步handleUploadFile(事件){

  const file=event . target . files[0]

  假设formData=新表单数据()

  formData.append(files ,file)

  const res=await service({

  URL:“/API/files/upload”,

  方法: POST ,

  数据:表单数据

  })

  console . log(RES . data);

  }

  再次发送请求。这一次,请求仍然没有成功。服务器未报告错误,但后端无法获取文件数据。继续分析请求消息,发现属性值更改为application/x-www-form-urlencoded。这是一个普通的表格,肯定是无法正确传递文件的。

  

解决方案:

  在查阅了大量网上的帖子后,我们知道axios会在发出请求前拦截请求,并自动为我们的请求设置一些参数。application/x-www-form-urlencoded参数出现在上面,因为axios已经为post请求设置了默认的请求头。如果我们没有在config中指定其他请求头,我们将使用默认的请求头。

  我们还了解到,当以multipart/form-data格式发送请求时,我们不需要自己指定Content-Type属性,浏览器会自动帮助我们设置它。

  那么解决问题的关键就是不让axios帮我们自动配置

  Axios的配置中有一个transformRequest属性。官方的解释是,在请求发出之前,我们可以手动干预。属性值是一个数组,您可以在其中定义一个函数并接收两个参数,即数据和头。数据是我们刚刚定义的FormData对象,头是axios预定义的请求头。

  打印标题:

  删除post属性中的Content-Type属性来解决问题。

  最终代码如下:

  异步handleUploadFile(事件){

  const file=event . target . files[0]

  假设formData=新表单数据()

  formData.append(files ,file)

  const res=await service({

  URL:“/API/files/upload”,

  方法: POST ,

  transform request:[function(data,headers) {

  //删除post请求的默认内容类型

  删除headers.post[Content-Type]

  返回数据

  }],

  数据:表单数据

  })

  console . log(RES . data);

  }

  上面的解决方案是我不断试错后得到的。网上很多关于这个问题的帖子都解决不了,让我很生气。希望这个帖子能帮你避免踩这个坑~

  关于如何使用axios将文件上传到后端(多部分/表单数据)的文章到此结束。有关axios发送post请求以上传文件的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: