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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 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 写一个文件上传接口。

目录
相关文章
|
2月前
|
前端开发 应用服务中间件 API
|
6月前
|
移动开发 前端开发 JavaScript
[后端基础] 文件上传的发展史
[后端基础] 文件上传的发展史
|
自然语言处理 安全
Web3.0钱包系统开发(开发功能)/指南教程/步骤流程/方案设计/项目逻辑/规则玩法/案例源码
Wallet type selection: Determine the type of wallet, which can be a browser plugin wallet, mobile application wallet, or online web wallet. The choice of wallet type should be based on the target user group and usage environment.
|
11月前
|
测试技术 Go
【测试平台系列】第一章 手撸压力机(五)- 结构化http请求配置
我们现在将上一级称之为TestObject(测试对象),现在我们梳理一下TO(测试对象简称,以后的文章中TO都代表测试对象)都需要哪些字段。
|
6月前
|
JSON 前端开发 JavaScript
前端上传文件前检测文件数据🔍
前端上传文件前检测文件数据🔍
121 0
|
JSON 监控 API
php对接小鹅通API开发高级实战案例解析:获取指定资源学习记录信息(单人单学习记录、单人多学习记录累计、返回数据格式确认)
php对接小鹅通API开发高级实战案例解析:获取指定资源学习记录信息(单人单学习记录、单人多学习记录累计、返回数据格式确认)
304 0
【C#编程最佳实践 十九】与文件相关的操作
【C#编程最佳实践 十九】与文件相关的操作
96 0
|
编解码 JavaScript 前端开发
Web阶段:第十五章:文件上传&下载
Web阶段:第十五章:文件上传&下载
112 0
Web阶段:第十五章:文件上传&下载
|
中间件
《大胖 • 小课》- 写一个文件上传接口
这是《大胖小课》栏目的专题一《说说文件上传那些事儿》的第二节-《写一个文件上传接口》 上一节 《大胖 • 小课》- 我是这样理解文件上传原理的,我们说到了文件上传的原理,服务端的文件保存我们使用koa-body来完成。
155 0
《大胖 • 小课》- 写一个文件上传接口
|
JSON 前端开发 数据可视化
一文了解文件上传全过程(1.8w字深度解析,进阶必备)
由于文件上传功能将使许多应用程序受益,因此建议对HTML进行扩展,以允许信息提供者统一表达文件上传请求,并提供文件上传响应的MIME兼容表示。
一文了解文件上传全过程(1.8w字深度解析,进阶必备)