こんにちは。@ryuzeeです。

前回、AzureのBlobサービスにブラウザから直接ファイルをアップロードするという話を書きましたが、残念ながら前回の実装は、AzureのBlobサービスのPUTの制限で64MBまでしか登録することができませんでした。

そこで今回は、AzureのBlobサービスにブラウザ経由で直接64MB超えのファイルを登録する方法を紹介します。なお、Rubyスクリプトの部分(CORSの設定やSASの取得など)は前回と変更ありませんので、フォームのみの修正です。

細かいところはコードを見てもらうとして、分割アップロードの実装において注意すべき点を列挙します。

  • 64MBを超えるファイルをアップロードしたい場合は、最大4MBのファイルのブロックに分割してPUTします。
  • 分割したブロックをPUTする際には、生成したSASのURLの末尾に、comp=block&blockid=ブロックIDを追加しないといけません。
  • ブロックIDは、base64エンコードされた文字列である必要があります。さらに、複数のブロックがある場合、全てのブロックのブロックIDの文字列長は同じでなければいけません。
  • 全てのブロックを送信し終わったら、ブロックリストをPUTする必要があります。URLは、SASの末尾にcomp=blocklistを追加します。
  • ブロックリストの送信の本文はXMLで、それまでに送信したブロックIDを列挙します。
  • ブロックリストの送信の際は、HTTPヘッダーに、x-ms-versionの設定が必要です。

その他、前回の話も含めて検討した方がよさそうな箇所についても列挙します。

  • SASを使って認証URLを取得しますが、このURLを知っていれば有効期間中は、当該ファイル名での書き込みができます。すなわち認証URLの有効期限はあまり長くしてはいけません。
  • いくらJavaScriptで制御したとしても、ユーザーがSASのURLを知るのは簡単なので、巨大ファイルをPUTされたりしそう。
  • アップロード画面で任意のファイル名をユーザーの指定でアップロードできるようにするのは上書きなどの問題がありそう。SASを発行する際のファイル名はシステム側で作成することを推奨。

ちなみに実行するとこんな感じですね。

以上、誰得かまったく分からない話でした…

views/form.erb


%MINIFYHTMLae69499640e137f94687d91e7bfa44ba5%

0%

%MINIFYHTMLae69499640e137f94687d91e7bfa44ba6%%MINIFYHTMLae69499640e137f94687d91e7bfa44ba7%

本ブログで取り上げてほしいコンテンツがありましたらお気軽にご連絡ください。