Je fais des API REST depuis un certain temps maintenant, et je suis toujours sur le point de me tromper avec un cas - le téléchargement de fichiers volumineux. J'ai lu quelques autres API, comme Google Drive, Twitter et d'autres publications, et j'ai eu deux idées, mais je ne suis pas sûr que l'une d'entre elles soit "appropriée". ce client), ou mieux encore, il pourrait être facilement appelé avec cURL. Le plan est de l'implémenter en Java, de préférence Play Framework.
Évidemment, j'aurai besoin d'un partitionnement de fichiers et d'un mécanisme de mise en mémoire tampon côté serveur car les fichiers sont volumineux.
Donc, la première solution que j'ai est un téléchargement en plusieurs parties (multipart/form-data
). J'arrive de cette façon et je l'ai implémenté comme ça auparavant, mais il est toujours étrange pour moi d'émuler un formulaire côté client, d'autant plus que le client doit définir le nom de la clé du fichier, et d'après mon expérience, c'est quelque chose que les clients oublient ou ne comprennent pas. De plus, comment est dictée la taille du morceau/la taille de la pièce? Qu'est-ce qui empêche le client de mettre le fichier entier en un seul morceau?
Deuxième solution, du moins ce que j'ai compris, mais sans trouver une implémentation réelle de l'implémentation, c'est qu'une requête "régulière" POST peut fonctionner. Le contenu doit être fragmenté et les données sont tamponnées sur le serveur) Cependant, je ne suis pas sûr que ce soit une bonne compréhension. Comment les données sont-elles réellement fragmentées, le téléchargement s'étend-il sur plusieurs requêtes HTTP ou est-il fragmenté au niveau TCP? Qu'est-ce que le Content-Type
?
En fin de compte, lequel de ces deux (ou autre chose?) Devrait être un moyen convivial et largement compréhensible d'implémenter une REST API pour le téléchargement de fichiers?
Je recommanderais de jeter un œil à la solution de l'API Amazon S3 Rest pour le téléchargement de fichiers en plusieurs parties. La documentation peut être trouvée ici .
Pour résumer la procédure qu'Amazon utilise:
Le client envoie une demande pour lancer un téléchargement en plusieurs parties, l'API répond avec un identifiant de téléchargement
Le client télécharge chaque bloc de fichier avec un numéro de pièce (pour maintenir l'ordre du fichier), la taille de la pièce, le hachage md5 de la pièce et l'id de téléchargement; chacune de ces demandes est une demande HTTP distincte. L'API valide le bloc en vérifiant le bloc de hachage md5 reçu par rapport au hachage md5 fourni par le client et la taille du bloc correspond à la taille fournie par le client. L'API répond avec une balise (identifiant unique) pour le bloc. Si vous déployez votre API sur plusieurs emplacements, vous devrez réfléchir à la façon de stocker les morceaux et d'y accéder ultérieurement de manière transparente.
Le client émet une demande pour terminer le téléchargement qui contient une liste de chaque numéro de bloc et la balise de bloc associée (identifiant unique) reçue de l'API. L'API valide qu'il n'y a pas de morceaux manquants et que les numéros de morceaux correspondent à la bonne balise de morceau, puis assemble le fichier ou renvoie une réponse d'erreur.
Amazon fournit également des méthodes pour abandonner le téléchargement et répertorier les morceaux associés au téléchargement. Vous pouvez également envisager un délai d'expiration pour la demande de téléchargement dans lequel les morceaux sont détruits si le téléchargement n'est pas terminé dans un certain laps de temps.
En termes de contrôle des tailles de blocs que le client télécharge, vous n'aurez pas beaucoup de contrôle sur la façon dont le client décide de fractionner le téléchargement. Vous pouvez envisager de configurer une taille de segment maximale pour le téléchargement et de fournir des réponses d'erreur pour les demandes contenant des segments supérieurs à la taille maximale.
J'ai trouvé que la procédure fonctionne très bien pour gérer les téléchargements de fichiers volumineux dans les API REST et facilite la gestion des nombreux cas Edge associés au téléchargement de fichiers. Malheureusement, je n'ai pas encore trouvé de bibliothèque cela facilite l'implémentation dans n'importe quelle langue, vous devez donc à peu près écrire toute la logique vous-même.
https://tus.io/ est un protocole pouvant être repris qui aide à télécharger et à reprendre le téléchargement après expiration du délai. Il s'agit d'une implémentation open source et a plusieurs implémentations client et serveur déjà dans différentes langues.