关于vue+axios上传文件的踩坑分析

上传文件是每个前端开发者都会遇到的问题,在之前实习期做了一个上传文件的功能,当时没有彻底搞明白问题所在,现在重新复盘下。

1.使用formData来上传文件,没有使用axios上传文件,之前在学校有做过。生成一个formData对象

let formData = new FormData()
formData.append(‘xxx‘, ‘yyyyy‘)

通过dom操作获得input中file[0],然后append给formData对象,网上有详细的api

2.在使用axios之后发先我之前用的方法后台接受不到文件,问题是content-type是application/json,上传文件的时候使用的content-type应该是multipart/form-data才对。看了网上的一些理解,好像是说这个conten-type会在我们上传文件的时候自动变为multipart/form-data,但是为什么我的是json呢。问题的关键在axios身上

axios.interceptors.request.use(
  request => {
    store.dispatch(‘httpStatus‘, { status: ‘‘, statusMsg: ‘‘ })
    return request
  },
  error => {
    return Promise.reject(error)
  }
)

axios对我们的request做了一个拦截然后重新返回,这个时候我们的formData会被变为一个Object,浏览器给出的是application/json,所以我们的操作失败了

3.如何解决这个问题呢?

  3.1我们在我们的action.js中修改axios的配置

let config = {
    headers: {
      ‘Content-Type‘: ‘multipart/form-data‘
    }
  }

结果当然还是不行,怎么会这么容易就让我搞定呢!!!,后台报错 ---no multipart boundary was found,就是一个二级制的分隔符不见了,我们可以手动添加一个

let config = {
   headers: {
    ‘Content-Type‘: ‘multipart/form-data;boundary = ‘ + new Date().getTime()
    }
}

可以了,但是我还是觉得不是很好,应该我们改动了headers里的东西,于是乎又看了我导师和网上的方法,一起贴出来。

  3.2 创建新的axios实例,挂在在vue原型上

  具体参考这篇文章https://www.jianshu.com/p/1405f389fb1d

  3.3 我导师给的方案,在action.js,axios的第三个参数config,加入一个transformRequest

let config = {
    headers: {
      ‘Content-Type‘: ‘multipart/form-data‘
    },
    transformRequest: [function (data) {
      return data
    }]
  }

关于这个方法我查了以下api,他是说 transformRequest 允许在向服务器发送前,修改请求数据,这个回调中可以对data进行修改,这样设置 config之后,问题就解决了

原文地址:https://www.cnblogs.com/czy960731/p/11105166.html

时间: 2024-08-30 07:40:30

关于vue+axios上传文件的踩坑分析的相关文章

vue element-ui,上传文件加载进度条显示效果(使用定时器实现源码分享)

上传文件效果如图: 父组件相关代码 html <drag-upload ref='mychild' action="//接口相关地址" v-model="versionwareList" @submitUploadParent='formSubmit' @input='delUpload' :autoUpload="autoUpload" :visible="visible" :disabled="disabl

vue项目上传文件以及进度条

最近做项目的时候,需要上传自定义镜像.并且附带进度条,上网查询一下资料,经过一番折磨,也总算做出来了,把自己写项目的内容给大家分享一下. 先直接贴代码吧 1.首先声明一个formData对象. 2.把需要上传的参数利用append追加进去. append('参数名','值') 第一个this.$refs.upload.files[0],其实就是input标签加上ref唯一关键字就是upload. var fd = new FormData(); fd.append('image', that.$

关于使用elementUI直传七牛云上传 and 下载踩坑

这几天一直研究七牛云的,,由于本人对elementUI框架的不熟悉,,踩了很多坑. 首先需要注册一个七牛云,最近快赶上双十一,所以七牛云新用户价格低廉500G*6个月只用了一分钱,废话不多说直接上代码. 先说说上传 前端使用elementUI的<el-upload>组件: <el-upload action="http://upload-z2.qiniup.com" :http-request="sliderRequest" :name="

Vue.js 上传文件(后台使用.net)

页面部分 <div id="app"> <form id="myform"> <input type="file" name="fileup" id="fileup" v-on:change="fileChange($event)" /> </form> <br /> {{img}} </div> <scrip

【转】JQuery插件ajaxFileUpload 异步上传文件(PHP版)

前几天想在手机端做个异步上传图片的功能,平时用的比较多的JQuery图片上传插件是Uploadify这个插件,效果很不错,但是由于手机不支持flash,所以不得不再找一个文件上传插件来用了.后来发现ajaxFileUpload这个插件挺不错,所以就用这个插件来做异步上传文件的效果.网上也有很多对ajaxFileUpload插件的使用的文章,不过我发现没有PHP版,所以这次服务器那边的处理就使用PHP语言来处理. 一.先对ajaxFileUpload插件的语法参数进行讲解 原理:ajaxfileu

JQuery插件ajaxFileUpload 异步上传文件(PHP版)

太久没写博客了,真的是太忙了.善于总结,进步才会更快啊.不多说,直接进入主题. 前几天想在手机端做个异步上传图片的功能,平时用的比较多的JQuery图片上传插件是Uploadify这个插件,效果很不错,但是由于手机不支持flash,所以不得不再找一个文件上传插件来用了.后来发现ajaxFileUpload这个插件挺不错,所以就用这个插件来做异步上传文件的效果.网上也有很多对ajaxFileUpload插件的使用的文章,不过我发现没有PHP版,所以这次服务器那边的处理就使用PHP语言来处理. 一.

Vue上传文件:ElementUI中的upload实现

一.上传文件实现 两种实现方式: 1.直接action <el-upload class="upload-file" drag :action="doUpload" :data="pppss"> <i class="el-icon-upload"></i> <div class="el-upload__text">将文件拖到此处,或<em>点击上传

vue 上传文件 并以表格形式显示在页面上

先上代码 <label for="file" class="btn">多文件上传</label> <input type="file" style="display:none;" id="file" multiple @change="file()"> 这是上传文件的按钮 <table> <tr> <th class=&q

在asp.net 中怎样上传文件夹

以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传  可以带参数 [HttpPost("upload")] public JsonResult uploadProject(IFormFile file, string userId) { if (file != null) { var fileDir = "D:\\aaa"