Aller au contenu principal

download de fichiers volumineux à l’aide de requêtes de plage

Une demande de plage demande au serveur d'envoyer uniquement une partie d'un fichier. Une seule demande GET download le fichier entier. Avec des demandes de plage, vous pouvez download un fichier volumineux en plusieurs petites demandes, ou reprendre un download interrompu plutôt que de recommencer depuis le début.

Demander une plage​

Pour demander une partie d’un fichier, envoyez l’en-tête Range avec les positions du premier et du dernier octet souhaités. Les positions start à 0 et la plage inclut les deux positions. Par exemple, bytes=0-1048575 demande le premier 1 MiB d’un fichier de 10 MiB :

HTTP
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>

La réponse 206 Partial Content contient uniquement les octets demandés. L'en-tête Content-Range indique les octets contenus dans la réponse et la taille totale du fichier.

Pour demander l’intégralité du contenu à partir d'une position jusqu'à la fin du fichier, omettez la dernière position, par exemple bytes=1048576-. Si la dernière position est située après la fin du fichier, la réponse contient les octets jusqu'à la fin du fichier.

Une requête HEAD avec un en-tête Range renvoie le même statut et les mêmes en-têtes que la requête GET correspondante, sans le corps.

Reprendre un download interrompu​

Si un download est interrompu, vous n'avez pas besoin de download à nouveau le fichier entier. Demandez les octets restants avec une plage qui start au premier octet que vous n'avez pas reçu.

Le fichier peut changer entre vos requêtes et la combinaison d'octets de différentes versions du fichier corrompt le résultat. Pour éviter cela, envoyez If-Match avec le ETag de votre première réponse. Si le fichier n'a pas changé, le serveur renvoie les octets restants :

HTTP
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>

Si le fichier a été modifié, le serveur renvoie 412 Precondition Failed à la place et vous pouvez start le download à nouveau.