对于Tus协议的理解与实现

一、Tus协议基本介绍

       这是一个基于HTTP协议的断点续传的协议,主要是保证文件上传可以续传。当然,不管是server还是client,都需要满足这个协议的要求,才可以进行文件传输。

1. 基本流程

       断点续传的核心就是有一个url,这个url就是上传的url,也可以通过这个url来获得已经上传的字节数,也就是upload-offset,客户端通过这个upload-offset就可以告知server,我们需要从哪里开始续传,自然对于第一次上传来说,这个偏移量就是0,也就是从头开始。

avatar

2. server的基本接口

       这里我们不提供params和query参数这些,我们只简单介绍下接口。

  • POST “/”, 这是最开始的接口,返回一个不存在的url,也就是开始创建一个上传时在headers里返回一个url。
  • HEAD “/:id”,其实这里的”/:id”就是获取的url,这是获取offset用的,不过我针对于s3的一些储存增加了一些返回字段。
  • PATCH “/:id”,这就是传输文件的核心接口,直到真正上传完毕,patch接口才会关闭
  • GET “/:id”,顾名思义,这是读取文件或者就是下载作用。
  • DELETE “/:id”,这就是删除文件的操作。

3. client的操作

       其实有许多的headers是必备的,不过这里我们先不讨论这些,由于官网给的server和client都有demo,而且很多逻辑没有让我们自己实现,所以想清楚的了解请求参数这些的,必须去读源码了解一下。

       客户端这边其实很简单,本地保存一个数据库或者其他什么可以储存键值对json文件的就行,对于要上传的文件,总能匹配创立一个唯一的md5的key,通过这个key在client本地找寻url,如果有表示之前创立过url和上传,那就可以续传;如果没有,表示这是第一次传输,需要POST请求道server去创立一个url。

       有了url之后,就是Head-Patch的请求了,先head是为了获取offset,如果offset和filesize一样,表示传完了,如果offset < filesize,那么就可以续传,对这个url传输就行,传输开始就是offset之后的内容即可。

二、对于保存至AWS S3的一些认识

       这个golang语言的server提供了数据保存至aws s3的支持,其实server和s3之间的传输我们也并不需要了解那么多,这也是支持断点续传的,不过我们核心是理解client和server的通信,其实这和保存于server本地是一样的。只是存到S3必须得s3上文件创建成果才会结束上传。这没什么不一样。

       大概简单的记录一些在这里,后续更新。