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

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

34资源网2022-05-22540

项目场景:

后端:实现了一个文件上传服务接口,可以接收前端传递过来的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

分享给朋友:

相关文章

低成本创业好项目,这个可日赚几千元

低成本创业好项目,这个可日赚几千元

这几年创业项目也变得越来越多了,大家都知道,现在靠打工是挣不了什么钱的,所以,很多人宁愿自己创业不想打工。那么,低成本创业项目有哪些呢?下面小编马上为大家推荐一个低成本创业项目,如果你有资源的话,也可以免费去推广操作,做好了日赚几千也是很容…

视频号入口在哪里(视频号直播入口新手手册)

视频号入口在哪里(视频号直播入口新手手册)

视频号助手在哪里?视频号助手什么时候上线?微信视频号助手正式上线目前微信视频号助手已经开始内测使用了,大家可以直接在PC端扫码登录,管理自己的视频号,可以看到自己的各项动态数据,非常方便管理。 视频号助手在哪里 视频号助手在哪里? 手机微…

融资丨「镭昱半导体」获千万美元Pre-A轮融资,全彩Micro-LED微显示芯片助力元宇宙发展

融资丨「镭昱半导体」获千万美元Pre-A轮融资,全彩Micro-LED微显示芯片助力元宇宙发展

创业邦获悉,近日,镭昱半导体(Raysolve)宣布完成千万美元Pre-A轮融资,由高榕资本领投,耀途资本跟投,泰合资本担任独家财务顾问。至此,在短短半年内,镭昱半导体完成两轮融资,累计获得投资近亿元人民币。本轮融资将用于公司的全球首款标准…

win7开始菜单设置在哪里(win7开始菜单变成经典模式)

win7开始菜单设置在哪里(win7开始菜单变成经典模式)

我们在用win7系统的时候,发现打开了一些程序后,会在开始菜单那里显示这些最近打开的程序。有些人不想把自己最近打开的程序显示在这里,那么怎么可以删除这些程序,或者彻底让这里不会显示最近打开程序呢?下面我来教大家删除或设置不显示最近打开的程序…

这家带有ESG基因的SaaS公司,如何定义未来的服装行业?

这家带有ESG基因的SaaS公司,如何定义未来的服装行业?

编者按:本文转自GGV纪源资本,创业邦经授权转载。 随着新一轮科技革命和产业变革,服装行业进行数智化转型升级已经成为了行业共识,但是多数企业对服装智能制造转型升级系统性认识不足,传统大批量流水线的生产方式无法满足市场“多款式”、“小批量”、…

dnf宇宙恶魔怎么打单人机制(单人宇宙恶魔罗什打法攻略)

在DNF游戏中,大家应该都认识宇宙恶魔罗什吧,这是一个非常强的BOSS,很多小伙伴都卡在这里,那么要怎么打呢,感兴趣的小伙伴就跟随小编一起来看看吧。 dnf单人宇宙恶魔罗什攻略 之所以打不过是因为玩家不清楚其机制。 进入BOSS战关卡后,罗…