Meilleures pratiques pour créer et télécharger un ZIP énorme (à partir de plusieurs BLOB) dans une WebApp

J'ai besoin de réaliser un massif de téléchargement de fichiers à partir de mon Application Web.

Il est évidemment prévu pour être une longue action (il sera utilisé une fois par année [par client]), de sorte que le temps n'est pas un problème (à moins qu'il frappe certaines délai d'attente, mais je peux gérer que par la création d'une certaine forme de keepalive heartbeating). Je sais comment créer un caché iframe et l'utiliser avec content-disposition: attachment tente de télécharger le fichier au lieu de l'ouvrir dans le navigateur, et comment l'exemple d'une communication client-serveur pour le dessin d'une jauge de progression;

La taille réelle de le télécharger (et le nombre de fichiers) est inconnue, mais pour simplifier, on peut presque le considérer comme 1 GO, composé de 100 fichiers de 10 mo.

Depuis ce doit être un one-cliquez sur l'opération, ma première pensée a été de regrouper tous les fichiers, lors de la lecture à partir de la base de données, généré dynamiquement, un ZIP, puis demander à l'utilisateur d'enregistrer le ZIP.

La question est: quelles sont les pratiques exemplaires, et quels sont les inconvénients et les pièges, dans la création d'une énorme archive de plusieurs petits tableaux d'octets dans une WebApp?

Qui peuvent être aléatoirement divisés en:

  • doit chaque tableau d'octets être converti en un fichier temporaire, ou peuvent-ils être ajoutés à l'ZIP dans la mémoire ?
  • si oui, je sais que je vais avoir à gérer le possible, l'égalité de noms (ils peuvent avoir le même nom dans différents enregistrements dans la base de données, mais pas à l'intérieur du même système de fichiers, ni ZIP): est-il possible d'autres problèmes qui viennent à l'esprit (en supposant que le système de fichiers a toujours assez d'espace physique) ?
  • puisque je ne peux pas compter sur d'avoir assez de RAM pour exécuter l'ensemble de l'opération en mémoire, je suppose que le ZIP doit être créé et nourri dans le système de fichiers avant d'être envoyé à l'utilisateur; est-il possible de faire autrement (par exemple avec websocket), comme de demander à l'utilisateur l'emplacement où enregistrer le fichier, et ensuite, à partir d'un flux constant de données à partir du serveur vers le client (Sci-Fi je suppose) ?
  • d'autres problèmes connus ou des meilleures pratiques qui traversent votre esprit serait grandement apprécié.

source d'informationauteur Andrea Ligios