当前位置:首页 > 谈天说地

解决axios发送post请求上传文件到后端的问题(multipart/form-data)

34资源网2022-05-22611

项目场景:

后端:实现了一个文件上传服务接口,可以接收前端传递过来的multipartfile文件,并存储到服务器本地中。
前端:获取typefile<font>标签中的文件,使用axioshttp请求库,发送post请求,将文件发送给后端。

问题描述

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

  • new一个formdata对象,使用append方法将文件添加到表单中
  • formdata专门用于js中发送multipart/form-data格式请求
  • append方法的key为表单中的name属性,即后端需要接收的参数名
async handleuploadfile(event) {
  const file = event.target.files[0]
  let formdata = new formdata()
  formdata.append('files', file)
  const res = await service({
    url: '/api/files/upload',
    method: 'post',
    headers: {
       'content-type': 'multipart/form-data'
    },
    data: formdata
  })
  console.log(res.data);
}

实际运行以上这段代码时,会发现后端报500错误如下:

caused by: java.io.ioexception:
org.apache.tomcat.util.http.fileupload.fileuploadexception: the request was rejected because no multipart boundary was found

大概的意思是说,后端无法识别到传递来的文件中的boundary,从而无法区分一个文件的内容从报文的哪个地方开始,又从报文的哪个地方结束,最终导致文件上传失败。

原因分析:

分析以上这种情况的原因,是因为我在发送请求时将请求头中content-type属性给写死为multipart/form-data浏览器无法自动给我们的报文添加boundary

我尝试将前端请求config中,headers配置移除,如下:

async handleuploadfile(event) {
  const file = event.target.files[0]
  let formdata = new formdata()
  formdata.append('files', file)
  const res = await service({
    url: '/api/files/upload',
    method: 'post',
    data: formdata
  })
  console.log(res.data);
}

再次发送请求,这次仍然没有请求成功。服务器没有报错了,但是后端获取不到文件数据。继续分析请求报文,发现属性值变为application/x-www-form-urlencoded,这是发送普通的表单,肯定是无法正确将文件送达的。

解决方案:

在查阅了网上大量的帖子之后得知,axios在请求发送出去之前会进行一次拦截,自动给我们的请求设置一些参数。上面会出现application/x-www-form-urlencoded这个参数就是因为axios设置了post请求的默认请求头,如果我们没有在config中指定其它请求头的话,就会使用默认的。

又了解到,发送multipart/form-data格式的请求时,不需要我们自己指定content-type属性,由浏览器自动帮我们去设置。

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

axiosconfig中有一个transformrequest属性,官方的解释是可以在请求发送之前让我们人为干预。属性值是一个数组,里面可以定义一个函数,接收两个参数,分别是dataheadersdata就是我们刚刚定义的formdata对象,headers里面则是axios预定义的请求头。

打印headers

post属性中的content-type属性删掉即可解决问题。

最终代码如下:

async handleuploadfile(event) {
  const file = event.target.files[0]
  let formdata = new formdata()
  formdata.append('files', file)
  const res = await service({
    url: '/api/files/upload',
    method: 'post',
    transformrequest: [function(data, headers) {
      // 去除post请求默认的content-type
      delete headers.post['content-type']
      return data
    }],
    data: formdata
  })
  console.log(res.data);
}

以上的解决方法是我不断试错之后得出来的,网上关于这个问题的很多帖子都不能解决,气死我了。。。希望这篇帖子能帮助大家避免踩这个坑吧~

到此这篇关于如何使用axios发送post请求上传文件到后端(multipart/form-data)的文章就介绍到这了,更多相关axios发送post请求上传文件内容请搜索萬仟网以前的文章或继续浏览下面的相关文章希望大家以后多多支持萬仟网!

看完文章,还可以扫描下面的二维码下载快手极速版领4元红包

快手极速版二维码

快手极速版新人见面礼

除了扫码领红包之外,大家还可以在快手极速版做签到,看视频,做任务,参与抽奖,邀请好友赚钱)。

邀请两个好友奖最高196元,如下图所示:

快手极速版邀请好友奖励

扫描二维码推送至手机访问。

版权声明:本文由34楼发布,如需转载请注明出处。

本文链接:https://www.34l.com/post/15943.html

分享给朋友:

相关文章

养成良好的习惯,做一名有品位的教师

养成良好的习惯,做一名有品位的教师

陶行知先生说:“思想决定行动,行动养成习惯,习惯形成品质,品质决定命运”。最近从网上读了《影响教师一生的100个好习惯》一书,不禁对陶先生这句话有了更深刻的领悟和理解。阅读本书带给我的不仅是享受,更多的则是生活的引领,智慧的传递和方法的教授…

苹果X快充PD充电器推荐,现在下载还有优惠券可以领呢

苹果X快充PD充电器推荐,现在下载还有优惠券可以领呢

现在有很多人用的是苹果手机,因为平时有些人不注意使用方式或者使用充电器比较频繁导致损坏。大家都知道苹果手机和安卓手机的充电器是不一样的,不能用安卓手机的充电器充苹果手机。所以,大家如果苹果手机充电器损坏了,需要购买的话就要买个专门的苹果手机…

扫地机器人市场的2021:后浪翻涌,前浪头疼

扫地机器人市场的2021:后浪翻涌,前浪头疼

编者按:本文来自锋见,创业邦经授权发布。 转眼2021年已接近尾声,2022年即将来临。回顾过去这一年,注定是不平凡的一年,特别是对于扫地机器人行业来说,2021年发生了不少大事,对行业影响深远。今天我们就来盘点和点评一下。 科技改变生活,…

如何删掉分页符空白页(空白页的解决方法)

如何删掉分页符空白页(空白页的解决方法)

我相信大家在编辑Word文档时,一定都遇到过这种恼人的情况,好不容易编辑完文档了,却发现末尾留下了空白页,想删除都无从下手。那么到底如何快速删除Word空白页呢?今天就来教大家几招,保证让你删得干干净净! 方法一:Shift键删除空白页…

ic卡与id卡区别(卡片类型和原理的区别)

ic卡与id卡区别(卡片类型和原理的区别)

IC卡全称为集成电路卡,也称智能卡,特点是可读写,可加密,安全性高、容量大,可存储数据,常用于一卡通系统;ID卡全称为身份识别卡,这只是一种感应卡,这种卡只可读不可写,有固定的编号,常用于门禁和考勤系统。 IC卡可以说是ID卡的一种升级形…

macbook怎么装windows系统(mac电脑安装windows步骤)

macbook怎么装windows系统(mac电脑安装windows步骤)

创作立场声明:分享我的一些使用心得和个人观点,供参考。 虽说仍是用虚拟机运行,实际体验非常流畅。 前段时间Windows 11镜像泄漏之后,相信很多小伙伴第一时间都安装上开始体验了。我觉得Windows 11最大的变化是界面越来越“苹果化…