一、背景

最近在开发过程中,遇到的需要是需要上传高清图片,必须原图上传。由于在移动端应用,上传网络问题有很大的坑。当初的方案是直接采用将文件转化为base64,再进行上传,由于文件转化为base64后,文件大小会增加30%。又导致上传压力,影响用户体验。最终采取了以formData形式进行上传,也就是 File 上传文件。以这种形式可以提高上传速度提高30%以上。下面会讲解开发过程及遇到的问题。

二、实现方法

1、读取文件

通过input标签,我们可以得到一个file文件将这个file进行处理。

<input class="upload" type="file" ref="upload" accept="image/jpeg,image/jpg,image/png" @change="uploadImg($event)">

 // 选择本地图片uploadImg (e) {let file = e.target.files[0]}
复制代码

2、实例化FormData对象

因为我们是以表单的形式上传文件,所以必须进行实例化,再添加属性以及值。注意,这里必须进行实例化,否则无法上传。我们可以把formdata作为参数上传给后端。

  uploadImg (e) {// 获取filelet file = e.target.files[0]// 实例化let formdata = new FormData()formdata.append('file', file)}
复制代码

3、配置axios

在axios配置中,我们需要用POST方法,再配置headers,需要这个浏览器才知道是表单。

 headers: {'Content-Type': 'multipart/form-data;charset=UTF-8'
}
复制代码
  uploadImg (e) {// 获取filelet file = e.target.files[0]// 实例化let formdata = new FormData()formdata.append('file', file)upload(formdata).then(res => {// ...   })}
复制代码

基本的步骤就以上3个,但是开发过程中会遇到一些不明觉厉的坑,下面总结一下。

三、问题

1、请求报文里面的请求参数为空

由于出现请求参数为空,我们无法发送给后端数据,无法保存成功。遇到这个可以检查一下你的axios请求拦截部分是否对数据进行了处理,我遇到是的axios请求拦截中,multipart/form-data时候,数据直接就被Qs进行序列化了,因为无法序列化FormData的内容,所以返回的data就是一个空的内容,导致最后判断是不是formData对象时出错。解决方法,如果'Content-Type' === 'multipart/form-data;charset=UTF-8'就是直接返回data,不进行序列化。

transformRequest: [function (data, headers) {if (headers['Content-Type'] === 'application/x-www-form-urlencoded') {// 把一个参数对象格式化为一个字符串return qs.stringify(data)} else if (headers['Content-Type'] === 'multipart/form-data;charset=UTF-8') {return data} else {headers['Content-Type'] = 'application/json'}return JSON.stringify(data)}]复制代码

2、为什么请求会加上```boundary````

请求报文中出现了这个boundary,按道理我们没有加上去,那怎么会增加这个东西呢。其实这个是浏览器自己加上去的。如果大家去看axios中源码,处理请求头部分,如下:

axios会自动的判断是否是以formData的形式上传,就将Content-Type删除,也就是删除掉了multipart/form-data这个请求头。因为这种形式需要浏览器自行设置才可以进行上传。

四、总结

这种方式上传相对比较简单,也可以减少带宽的压力,不过需要后端进行配置处理比较多,根据需求进行合理利用。

转载于:https://juejin.im/post/5cff13ab6fb9a07ee1691e82

前端实现axios以表单方式上传文件,优化上传速度相关推荐

  1. ajax 模拟表单提交,Ajax模拟Form表单提交,含多种数据上传

    ---恢复内容开始--- Ajax提交表单.使用FormData提交表单数据和上传的文件(这里的后台使用C#获取,你可以使用Java一样获取) 有时候前台的数据提交到后台,不想使用form表单上传,希 ...

  2. 前端之表格,表单,列表

    ## 本资源由 itjc8.com 收集 --- typora-copy-images-to: media --- > 第01阶段.前端基础.表格 # HTML 第二天目标 能够利用表格.列表和 ...

  3. 前端基础:通过表单元素实践《健康体检单》

    前端基础:通过表单元素实践<健康体检单> HTML 表单用于接收不同类型的用户输入,用户提交表单时向服务器传输数据,从而实现用户与Web服务器的交互. 一.项目说明 该项目是进行表格布局表 ...

  4. 前端推荐!阿里高性能表单解决方案——Formily

    今天又到了我们的分享时间. 之前和大家分享了很多可视化的前端项目和工程化实践, 今天继续和大家分享一款非常有价值的开源项目Formily, 它可以帮助我们更高效的开发任何复杂的表单, 并且支持可视化搭 ...

  5. 【HTML5初探之form标签】解放表单验证、增加文件上传、集成拖放

    导航 [初探HTML5之使用新标签布局]用html5布局我的博客页! [HTML5初探之form标签]解放表单验证.增加文件上传.集成拖放 [HTML5初探之绘制图像(上)]看我canvas元素引领下 ...

  6. 使用ajax提交form表单,包括ajax文件上传 转http://www.cnblogs.com/zhuxiaojie/p/4783939.html...

    使用ajax提交form表单,包括ajax文件上传 前言 使用ajax请求数据,很多人都会,比如说: $.post(path,{data:data},function(data){... },&quo ...

  7. 前端页面与form表单提交:代码分享

    今天分享下"前端页面与form表单提交:代码分享"这篇文章,文中根据实例编码详细介绍,或许对大家的编程之路有着一定的参考空间与使用价值,需要的朋友接下来跟着云南仟龙Mark一起学习 ...

  8. 组件分享之前端组件——用于自定义表单的前端组件form-create

    组件分享之前端组件--用于自定义表单的前端组件form-create 背景 近期正在探索前端.后端.系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各 ...

  9. php 表单提交文件大小,PHP如何通过表单直接提交大文件详解

    PHP如何通过表单直接提交大文件详解 前言 我想通过表单直接提交大文件,django 那边我就是这么干的.而对于 php 来说,我认为尽管可以设置最大上传的大小,但最大也无法超过内存大小,因为它无法把 ...

最新文章

  1. php 链接多个mysql_PHP同时操作多个MySQL连接
  2. 图解命令行手动编译构建一个win32汇编程序
  3. mysql5.0 php_php怎么连接mysql5.0?
  4. Python的Pexpect库
  5. java获取网络带宽_Linux Java 获取CPU使用率,内存使用率,磁盘IO,网络带宽使用率等等...
  6. 参加 CSDN 2009 英雄大会有感(二)
  7. 临时禁用自增列插入数据
  8. Oracle SQL性能优化40条,值得收藏
  9. Spring Cloud Spring Boot mybatis分布式微服务云架构(五)构建RESTful API
  10. 微型计算机原理及应用程序题,微型计算机原理及应用试题及答案
  11. 【iCore3应用】基于iCore3双核心板的编码器应用实例
  12. 神秘的 shadow-dom 浅析
  13. 初期学习K60遇到的常见问题及解决办法
  14. 如何进行cad地理配准_地理配准和空间校正操作流程
  15. GBDT+LR算法入门理解
  16. 【持续更新】Leetcode SQL题目全解析(附建表sql)
  17. 软件开发流程有哪些?完整的软件开发流程
  18. Hadoop分布式集群搭建以及案例运行-fs操作
  19. 图书馆机器人索书号识别
  20. 敏涵化妆品何以圈粉Z世代消费群体?

热门文章

  1. 基于雷达-非接触式传感器的高次谐波峰值选择方法的准确心率和呼吸率检测
  2. 【Flutter 实战】17篇动画系列文章带你走进自定义动画
  3. 北京联通烽火HG2201U光猫破解研究
  4. 2022年SaaS发展趋势——私有本地化部署
  5. 标签、id、class选择器详解
  6. Win11配置vue开发环境
  7. 多肽合成技术原理,多肽合成方法解读
  8. 求是科学班计算机,浙江大学2010年“求是科学班”招生简介
  9. PLC实践小结(主要是PLC控制原理以及接线心得)
  10. Pandas-数据结构-DataFrame(六):布尔型索引【用于逻辑筛选】