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

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

34资源网2022-05-22560

项目场景:

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

分享给朋友:

相关文章

电脑微信可以发多大的视频(视频超过40分钟发送步骤)

电脑微信可以发多大的视频(视频超过40分钟发送步骤)

虽然腾讯在短视频领域迟迟未能取得优势,微视也很难撼动抖音、快手等头部APP的地位,但一直以来都未放弃这块蛋糕。 2021年二季度,随着微信以及Wechat活跃用户账户达到12.5亿,微信视频号的成长空间也被进一步拉大。而腾讯也很可能在短视频…

mac地址的作用是什么(理解mac地址的作用实验报告)

mac地址的作用是什么(理解mac地址的作用实验报告)

我们上网时会发现电子设备同时有IP地址和MAC地址,为什么上网会需要两个地址呢?…

融资丨「奕斯伟计算」完成25亿元C轮融资,目标物联网芯片领域全球领导者

融资丨「奕斯伟计算」完成25亿元C轮融资,目标物联网芯片领域全球领导者

创业邦获悉,12月1日,AIoT芯片与解决方案提供商北京奕斯伟计算技术有限公司(以下简称:奕斯伟计算)宣布完成25亿元人民币C轮融资,由金石投资和中国互联网投资基金联合领投,尚颀投资、国开科创、华新投资等跟投,老股东 IDG、君联资本、刘益…

区块链开发技术有前景吗(区块链技术开发费用)

由于人们对大数据、区块链、人工智能行业的认识越来越深入,企业可以通过大数据、区块链、人工智能等思维和技术寻求变革。传统行业依靠原有产业优势“后来居上”,低调布局区块链技术,传统产业企业和科技企业同时进入产业区块链赛道。在区块链发展报告中,我…

创业前4年无产品,量产一年销售近亿元,这家公司怎么做到的?

创业前4年无产品,量产一年销售近亿元,这家公司怎么做到的?

光子晶体前4年都在死磕产品研发,直到去年才正式量产,目前已实现每月数万平米的光学显示膜出货,销售额近亿元,收获了苹果、亚马逊等合作伙伴,在透明显示领域开了先河。 作者丨解夏 编辑丨及轶嵘 图源丨受访者 “家里的窗户、汽车车窗、公司的玻璃幕墙…

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

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

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