《大胖 • 小课》- 我是这样理解文件上传原理的

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 这是《大胖小课》栏目的专题一、《说说文件上传那些事儿》的第一节-《文件上传原理概述》之前发过一篇长文,内容太长,阅读体验太差,很难读完,换作是我也没这个耐心,所以借此专题进行分段介绍,短小精悍,直达主题。当然从整体上,内容会更详细一些,也会把安全问题考虑进去。

这是《大胖小课》栏目的专题一、《说说文件上传那些事儿》的第一节-《文件上传原理概述》

之前发过一篇长文,内容太长,阅读体验太差,很难读完,换作是我也没这个耐心,所以借此专题进行分段介绍,短小精悍,直达主题。

当然从整体上,内容会更详细一些,也会把安全问题考虑进去。

文件上传-原理概述


以大胖的理解,文件上传的原理很简单,就是根据 http 协议的规范和定义,完成请求消息体的封装和消息体的解析,然后将二进制内容保存到文件。

我们都知道如果要上传一个文件,需要把 form 标签的enctype设置为multipart/form-data,同时method必须为post方法。

那么multipart/form-data表示什么呢?

multipart 互联网上的混合资源,资源由多种元素组成,form-data 表示可以使用 HTML Forms 和 POST 方法把这些不同的资源提交到 http 服务器。

multipart/form-data 结构

看下 http 请求的消息体

156f164b78ea21d467f6684a19ec7d41_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

  • 请求头:

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryDCntfiXcSkPhS4PN 表示本次请求要上传文件,其中 boundary 表示分隔符,如果要上传多个表单项,就要使用 boundary 分割,每个表单项由———XXX 开始,以———XXX 结尾。

  • 消息体- Form Data 部分

每一个表单项又由Content-TypeContent-Disposition组成。

Content-Disposition: form-data 为固定值,表示一个表单元素,name 表示表单元素的 名称,回车换行后面就是name的值,如果是上传文件就是文件的二进制内容。

Content-Type:表示当前的内容的 MIME 类型,是图片还是文本还是二进制数据。

解析


客户端发送请求到服务器后,服务器会收到请求的消息体,然后对消息体进行解析,解析出哪是普通表单哪些是附件。

怎样解析

可能大家马上能想到通过正则或者字符串处理分割出内容,不过这样是行不通的,二进制buffer转化为string,对字符串进行截取后,其索引和字符串是不一致的,所以结果就不会正确,文件虽然能生成,但文件是无效的,除非上传的就是字符串,比如base64

不过一般情况下不需要自行解析,目前已经有很成熟的三方库可以使用。

至于如何解析,由于这个会占用很大篇幅,咱们先说完实现,后面的文章在详细说解析原理。

下节预告


既然要上传文件,那肯定要先有个服务支持,也就是需要一个文件上传的接口,一般的不需要前端写,都是对接后端 php、java 等,不过现在前后端知识界限没有那么明确了,都是所谓的全栈了,所以下一节我们先用 node 写一个文件上传接口。

目录
相关文章
WRF模式案例运行初体验--飓风示例全过程记录
本文主要记录一下首次学习WRF并运行官网案例的全过程。
WRF模式案例运行初体验--飓风示例全过程记录
|
7月前
|
移动开发 前端开发 JavaScript
[后端基础] 文件上传的发展史
[后端基础] 文件上传的发展史
|
测试技术 Go
【测试平台系列】第一章 手撸压力机(五)- 结构化http请求配置
我们现在将上一级称之为TestObject(测试对象),现在我们梳理一下TO(测试对象简称,以后的文章中TO都代表测试对象)都需要哪些字段。
|
存储 JSON 搜索推荐
【测试平台系列】第一章 手撸压力机(十二)-初步实现提取功能
上一章节,我们主要实现了基础的并发测试场景的能力。本章节,我们实现一下,如何对响应进行提取,使用正则/json对响应信息提取,并赋值给我们定义的变量。
|
缓存 JSON 前端开发
腾讯开源的 hel 提供了加载远程模块的能力,谈谈它的实现原理
腾讯开源的 hel 提供了加载远程模块的能力,谈谈它的实现原理
184 0
|
存储 分布式计算 资源调度
膜拜!华为内部都在强推的783页大数据处理系统:Hadoop源代码pdf
大数据处理系统:Hadoop源代码情景分析,采用的是Hadoop2.6。如果你有点野心,想对大数据处理系统有比较深入透彻的了解,特别是想有朝一日自己也设计一个这样的系统,甚至自己把它写出来,那么你真应该认真读一下这本文,以及 Hadoop的源代码,看看人家是怎么设计怎么实现的。
|
JavaScript 容器
《大胖 • 小课》- 玩玩多文件配多进度上传
这是《大胖小课》栏目的专题一《说说文件上传那些事儿》的第4节-《玩玩多文件配多进度上传》 专题已经更新章节: 《大胖 • 小课》- 我是这样理解文件上传原理的 《大胖 • 小课》- 写一个文件上传接口 《大胖 • 小课》- 不用 js 实现文件无刷新上传 既然要说多文件配多进度上传,那就要看看单个进度是如何实现的。
120 1
《大胖 • 小课》- 玩玩多文件配多进度上传
|
编解码 JavaScript 前端开发
Web阶段:第十五章:文件上传&下载
Web阶段:第十五章:文件上传&下载
115 0
Web阶段:第十五章:文件上传&下载
|
中间件
《大胖 • 小课》- 写一个文件上传接口
这是《大胖小课》栏目的专题一《说说文件上传那些事儿》的第二节-《写一个文件上传接口》 上一节 《大胖 • 小课》- 我是这样理解文件上传原理的,我们说到了文件上传的原理,服务端的文件保存我们使用koa-body来完成。
160 0
《大胖 • 小课》- 写一个文件上传接口
|
JavaScript 前端开发
《大胖 • 小课》- 说说大文件分片和断点续传
一般在前端开发中我们上传文件大多是比较小的文件,比如图片、pdf、word 文件等,也只有一些特殊的业务和场景才会需要上传大文件,比如上传一个视频 ,最小也得500M。 那如果文件太大,比如500M 1G 2G 那么大,直接上传会造成什么后果呢? 直接上传过大文件,可能会出链接现超时的情况,而且也会超过服务端允许上传文件的大小限制,导致文件无法上传。 所以解决这个问题我们可以将文件进行分片上传,每次只上传很小的一部分 比如2M,多上传几次就可以啦。
244 0
《大胖 • 小课》- 说说大文件分片和断点续传

热门文章

最新文章