tusでファイルアップロード
初めに
少しおくれました,すみません.
今回は,tusというHTTPベースのプロトコルについて書こうと思います.
ファイルアップロード
ファイルアップロードのAPIを実装するにあたって,どのような方法で実装されますでしょうか.
2. ファイルをBase64にエンコードして,jsonにつめてアップロードする方法
1がよく実装されているイメージがあります.
grpc-gateway などを利用されている方は,2を選択するケースも見られます.
tus
それでは,今回紹介するtus について見ていこうと思います.
某大学のことではありません.
tus is a new open protocol for resumable uploads built on HTTP.
上記の通りtusとは,再開可能なアップロードを行える新しいHTTP上に構築されたプロトコルです.
ここにおける再開可能とは,いつでも中断でき,前のデータを再びアップロードせずに再開可能であることを意味しています.
ネットワークの問題などで途中で中断されて,再アップロードするというストレスがない画期的なプロトコルではないでしょうか.
demo
https://gyazo.com/dcf1ae18b2fafda76acd6a723e414c4f
このデモだとよくわからないかもしれませんが,PAUSE で中断して RESUME で再開しています.
実装
つづいて,実装について見ていきます.
tusを利用するには, こちら で提供されいるようなライブラリを使用する必要があります. cliantはjs, objective-c, javaがサポートされていてweb, mobile両方で利用可能です(swiftはなさそうです😅).
今回は, tsud というgolangで実装されたライブラリがどのようなリクエストを受け取っているかみていきたいと思います. tusdの実装
こちら のexampleをみるとわかるように,func NewHandler(config Config) (*Handler, error) で生成されたhandlerをhttp.Handleに渡すことでtusdが利用できます. http pkgのHandlerインターフェースを満たしているので,http pkgのほかにいろんなwebフレームワークで利用可能です.
ハンドラー
handler を見てみると,4つのエンドポイントが定義されています. どうやら,サーバはクライアントから送られている4のリクエストを受け.ファイルを保存しているようです.
code:handler.go
mux.Post("", http.HandlerFunc(handler.PostFile))
mux.Head(":id", http.HandlerFunc(handler.HeadFile))
mux.Add("PATCH", ":id", http.HandlerFunc(handler.PatchFile))
mux.Get(":id", http.HandlerFunc(handler.GetFile))
それぞれがリクエストを受け,どのような処理が行われているか見ていきたいと思います.
POSTリクエスト
クライアントは,新しいファイルをアップロードするために,POSTリクエストを行います.
またアップロードされる前に,ファイルサイズの検証(クライアントはheaderのUpload-Lengthに全体のバイト数を明記する必要がある)やメタデータのパースが行われます.
HEADリクエスト
クライアントは,もしなにかしらで中断したときにサーバにどこまで送ったかをHEADリクエストで問い合わせを行う必要があります.
PATCHリクエスト
クライアントは,オフセットによってどこまでファイルを送っているのか把握できるので,PATCHリクエストでちょっとずつリクエストを送ります.
PATCHリクエストは基本的にアップロードが完了するまで呼ばれ続けます.
GETリクエスト
保存先
tusd では,ローカルだけでなく,s3 やgcs などクラウドのストレージサービスに保存することができます(参考). 実装まとめ
なんとなくtusがどのようなhttpのリクエストを送っていて,ファイルアップロードしているかわかったのではないでしょうか.
もし,ローカルで動かしてみたい方は,クライアント と サーバ のexampleがそれぞれありますのでそちらからすぐ動かせることができるのでやってみてください. 終わりに
今回は,ファイルアップロードでのtusの利用について紹介しました.
tusプロトコルはシンプルに実装されており,並列アップロード,有効期限など様々な拡張もできます.
大きなファイルを扱うユースケースなどで利用してみてはどうでしょうか.
参考文献