断点续传(调研笔记篇)

  • 有木有类似 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 这里,一个大文件分三大步来传:

  1. 首先调接口让 server 知道我要传大文件了,server 返回一个 session_id
  2. 下次续传的时候,传一个 offset 和 session_id
  3. 传完的时候,调另外一个接口

关键:使用 Dropbox-API-Arg 这个 header 来告诉 server 当前上传的一些信息,比如是在传哪个文件,还有 offset,它的 offset 就是用文件的大小。

策略

Dropbox 上传有个 Header 叫做 Dropbox-API-Arg,值就是一个 json string。

  1. 小于 150MB 的文件,用 /upload 接口。一次性搞定。这个没啥好说的。
  2. 大约 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 呢?用途不一样把…

Updated:

Comments