範囲リクエストで大きなファイルをdownloadする
範囲要求は、ファイルの一部のみを送信するようにサーバーに要求します。単一の GET 要求は、ファイル全体を download します。範囲要求を使用すると、大きなファイルをいくつかの小さな要求でdownloadしたり、中断されたdownloadを最初からやり直すのではなく、再開したりできます。
範囲をリクエストする
ファイルの一部をリクエストするには、必要な最初のバイトと最後のバイトの位置を指定して Range ヘッダーを送信します。位置は0から始まり、範囲には両方の位置が含まれます。たとえば、bytes=0-1048575は10 MiBファイルの最初の1 MiBをリクエストします。
GET /api/3.0/fs/files/Volumes/main/default/my-volume/large-file.bin
Range: bytes=0-1048575
206 Partial Content
Accept-Ranges: bytes
Content-Range: bytes 0-1048575/10485760
Content-Length: 1048576
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
<binary data>
206 Partial Contentレスポンスには、リクエストされたバイトのみが含まれます。Content-Rangeヘッダーには、レスポンスに含まれるバイトとファイルの合計サイズが表示されます。
位置からファイルの最後までのすべてを要求するには、最後位置を省略します。例: bytes=1048576- 。最後の位置がファイルの末尾を過ぎている場合、応答にはファイルの末尾までのバイトが含まれます。
Rangeヘッダーを持つ HEAD 要求は、本体なしで、一致する GET 要求と同じステータスとヘッダーを返します。
中断されたdownloadを再開する
downloadが中断されても、ファイル全体を再度downloadする必要はありません。受け取っていない最初のバイトから始まる範囲で残りのバイトをリクエストします。
リクエスト間でファイルが変更される可能性があるため、ファイルの異なるバージョンのバイトを結合すると結果が破損します。これを回避するには、最初のレスポンスの ETag を指定して If-Match を送信してください。ファイルが変更されていない場合、サーバーは残りのバイトを返します:
GET /api/3.0/fs/files/Volumes/main/default/my-volume/large-file.bin
Range: bytes=1048576-
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
206 Partial Content
Accept-Ranges: bytes
Content-Range: bytes 1048576-10485759/10485760
Content-Length: 9437184
<binary data>
ファイルが変更されている場合、サーバーは代わりに412 Precondition Failedを返し、downloadを再度起動できます。