断点续传(调研笔记篇)
- 有木有类似
tus
的东西? - 百度云、Dropbox 等怎样做的大文件上传?
- 传统用的啥方法?
一些论断
第一个 论断
大概是讲:没有标准的 partial upload, resume upload
的协议。Google Drive/Dropbox 都有自己的协议。
Content-Range
the wording refers to it as an response header which gets used in response of a range-request.
Google Drive APIs - Uploading Files
参考文档:https://developers.google.com/drive/v3/web/manage-uploads
它的上传分成三种类型:
- 小文件上传。
simple upload
- 小文件和文件 metadata 在一个 request 中完成。
multipart upload
- 大文件可恢复的上传。
resumable upload
simple upload 就没啥好讲的了吧,一次性-全部内存操作。 multipart upload 就是把 metadata 和文件内容一起上传。(类似邮件内容+附件? resumable upload 看起来挺好的,没有黑科技,都是标准的东西,看起来挺人性化的。
multipart upload
POST /upload/drive/v3/files
用于上传文件
POST /drive/v3/files/
用于创建或者更新文件的 metadata
原理:use multipart/related
content type. 问题 multipart/form-data
是啥?
Dropbox
参考文档:https://www.dropbox.com/developers/documentation/http/documentation 总的来说:Dropbox 的 API 文档的理解难度远高于 Google 的那个呀。
阅读文档后的总结: 在 Dropbox 这里,一个大文件分三大步来传:
- 首先调接口让 server 知道我要传大文件了,server 返回一个 session_id
- 下次续传的时候,传一个 offset 和 session_id
- 传完的时候,调另外一个接口
关键:使用
Dropbox-API-Arg
这个 header 来告诉 server 当前上传的一些信息,比如是在传哪个文件,还有 offset,它的 offset 就是用文件的大小。
策略
Dropbox 上传有个 Header 叫做 Dropbox-API-Arg
,值就是一个 json string。
- 小于 150MB 的文件,用
/upload
接口。一次性搞定。这个没啥好说的。 - 大约 150MB 的文件,用
/upload_session/...
。(支持 chunked)
大文件上传
关注三个接口:/upload_session/start
, /upload_session/append_v2
, /upload_session/finish
start 接口:感觉不需要带什么参数(感觉文档有点问题)。服务端返回一个 session_id 用来续传。 append_v2 接口:带上文件内容。Arg 里面指定 session_id 和 offset。如果 offset 错了,会返回一个错误,并告诉你正确的 offset。 finish 接口:带上 session id。其它没什么特别的。
百度云
- 单文件上传 最大 2GB…(尼玛,这么大)上传成功的时候,server 返回文件一些基本信息。
- 大文件上传 在单文件上传基础上加一个
type=tmpfile
的参数。最后调用一个 createsuperfile 的接口,传之前文件的 md5 值。
tus 调研
说得好听是调研,其实是踩坑?
tus 这个项目竟然没有吹吹自己的 优势,也不说说以前的痛点在哪,要你何用?
而且你就 400 个 star 诶,怎感觉不靠谱啊…
tus 的几个 Headers
Upload-Offset
: a byte offset (感觉有点用)Upload-Length
: the size of the entire upload in bytes (感觉有点用)Tus-Version
: (并没啥用把?)Tue-Resumable
: (同感没啥用?)Tue-Extension
: a comma-separated list of the extensions supported by the Server (这也行?)Tus-Max-Size
: indicating the maximum allowed size of an entire upload in bytes (有点用的样子)X-HTTP-Method-Override
: (有点用的样子)
tus 的几种 Request 方法
没啥特殊的
tus 的 protocol extensions
Clients and Servers are encouraged to implement as many of the extensions as possible. 惊呆 ?
Creation
Creation 的 Headers
Upload-Defer-Length
: indicates that the size of the upload is not known currently and will be transferred later.Upload-Metadata
: consist of one or more comma-separated key-value pairs. (感觉有点扯…)
Expiration
Creation 的 headers
Upload-Expires
:
Checksum
Checksum 的 headers
Tus-Checksum-Algorithm
:Upload-Checksum
:
Termination
Requests
DELETE
等等所谓的 extensions… 感觉好扯淡…
基础概念
HTTP 2.0 vs HTTP 1.1
看起来暂时不需要太了解:https://http2.github.io/faq/#what-are-the-key-differences-to-http1x
byte
1B = 8b
GET, POST, PUT, PATCH 这些名词的概念是啥?
HTTP Methods
为啥会有这几种 Methods 呢?用途不一样把…
Comments