4 votes

Téléchargement d'un fichier dont certaines parties sont stockées sur plusieurs serveurs (HTTP)

Je travaille sur un système de téléchargement de fichiers qui stockera des parties individuelles de fichiers volumineux sur plusieurs serveurs. Ainsi, la distribution d'un fichier de 1 Go ressemblera à quelque chose comme ceci :

Server 1: 0-128MB
Server 2: 128MB-256MB
Server 2: 256MB-384MB
... etc

L'objectif est de permettre la redondance (chaque partie existera sur plus d'un serveur), la sécurité (aucun serveur n'a accès à l'ensemble du fichier) et le coût (les dépenses liées à la bande passante sont réparties).

Je suis curieux de savoir si quelqu'un a un avis sur la manière dont je pourrais "tromper" les navigateurs web pour qu'ils téléchargent les différentes parties en un seul lien.

Ce que j'avais à l'esprit, c'était quelque chose comme :

  1. Le navigateur est relié au serveur 1, qui fournit une taille de contenu du fichier complet.
  2. Une fois que les 128 Mo ont été utilisés, le serveur 1 ferme intentionnellement la connexion.
  3. Si tout va bien, le navigateur essaiera de relancer le téléchargement en demandant le serveur 1.
  4. Le serveur 1 fournit une redirection 3XX au serveur 2
  5. Le navigateur poursuit le téléchargement à partir du serveur 2

Je ne suis pas certain que mon exemple fonctionne, car je ne l'ai pas encore testé. J'étais curieux de savoir si quelqu'un avait d'autres solutions à proposer.

J'aimerais que l'ensemble du processus soit aussi simple que possible (idéalement, il n'y a rien à faire au-delà d'un simple téléchargement). Je ne veux pas que les utilisateurs soient obligés d'utiliser un autre programme (par exemple, en regroupant les fichiers). J'aimerais également ne pas utiliser de serveur proxy, car cela entraînerait des coûts supplémentaires en termes de bande passante.

A ma connaissance, il n'existe pas de solution javascript pour l'écriture un fichier, s'il en existait un, ce serait formidable.

2voto

Coder Points 176

AFAIK, cela n'est pas possible en utilisant le protocole HTTP. Vous pouvez probablement utiliser une extension de navigateur personnalisée, mais cela dépend du navigateur. Une autre solution consiste à créer un applet Java qui téléchargerait le fichier à partir de différents serveurs. L'applet peut accepter les URL des différents serveurs comme paramètres.

2voto

Greg Points 2033

Pour enregistrer le fichier généré : https://stackoverflow.com/a/4551467/329062

Cette solution stocke toutefois le fichier en mémoire, ce qui signifie qu'elle ne fonctionnera pas avec des fichiers très volumineux.

Vous pouvez télécharger les fichiers partiels dans une variable JS à l'aide de JSONP. Cela vous permettra également de contourner la politique de la même origine.

1voto

Ed Heal Points 24309

Le modèle de sécurité des javascripts ne vous permet d'accéder qu'aux données provenant de la même origine que le javascript, c'est-à-dire pas de plusieurs serveurs.

Si les bits du fichier se trouvent sur plusieurs serveurs, l'utilisateur devra charger la page web, récupérer le bit et enfin coller les bits dans le bon ordre. Si vous parvenez à faire faire cela (correctement) à tous vos utilisateurs, vous êtes meilleur que moi.

1voto

porneL Points 42805

Il est possible de le faire dans les navigateurs modernes via le protocole HTTP standard.

Vous pouvez utiliser XHR2 con CORS pour télécharger des morceaux de fichiers en tant que ArrayBuffer puis les fusionner en utilisant Blob et utiliser le constructeur createObjectURL pour envoyer le fichier fusionné à l'utilisateur.

Cependant, je pense que les navigateurs stockeront ces objets dans la mémoire vive, et c'est donc probablement une mauvaise idée de l'utiliser pour des fichiers volumineux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X