web-dev-qa-db-fra.com

Meilleur moyen de télécharger plusieurs fichiers à partir d'un navigateur

Je travaille sur une application web. Il existe un endroit où l'utilisateur peut télécharger des fichiers avec le protocole HTTP. Vous avez le choix entre le contrôle de téléchargement de fichier HTML classique et un applet Java pour télécharger les fichiers. 

Le téléchargement de fichier HTML classique n’est pas génial, car vous ne pouvez sélectionner qu’un fichier à la fois, et il est assez difficile d’obtenir une indication de la progression pendant le téléchargement (je l’ai finalement obtenu à l’aide d’une minuterie actualisant un indicateur de progression avec les données extraites de la serveur via un appel AJAX). L'avantage: ça marche toujours.

Avec l'applet Java, je peux faire plus de choses: sélectionner plusieurs fichiers à la fois (même un dossier), les compresser, obtenir une vraie barre de progression, glisser-déposer des fichiers sur l'applet, etc.
MAIS il y a quelques inconvénients: 

  • c'est un cauchemar de le faire fonctionner correctement sur Mac Safari et Mac Firefox (Merci Liveconnect)
  • l'interface utilisateur n'est pas exactement l'interface utilisateur native et certaines personnes remarquent que 
  • l'applet n'est pas aussi sensible qu'il le devrait (cela pourrait être de ma faute, mais tout me convient) 
  • il y a des bogues dans la classe UrlConnection de Java avec HTTPS; j'utilise donc le client HTTP commun Apache pour effectuer le téléchargement HTTP réel. C'est un paquet assez volumineux qui ralentit le téléchargement du fichier .jar 
  • le client HTTP commun Apache a parfois du mal à passer par les mandataires 
  • le runtime Java est assez gros

Je maintiens cette applet Java depuis un moment, mais maintenant, j'en ai marre de tous les inconvénients, et j'envisage d'écrire/d'acheter un tout nouveau composant pour télécharger ces fichiers. 

Question

Si vous aviez les exigences suivantes:

  • télécharger facilement plusieurs fichiers à partir d'un navigateur, via HTTP ou HTTPS
  • compresser les fichiers pour réduire le temps de téléchargement
  • le téléchargement devrait fonctionner sur n'importe quelle plateforme, avec une interface utilisateur native
  • doit pouvoir télécharger des fichiers volumineux, jusqu'à 2 Go minimum
  • vous avez carte blanche sur la technologie

Quelle technologie/composant utiliseriez-vous?


Modifier : 

  • Drag'n'Drop de fichiers sur le composant serait un grand plus.
  • Il semble y avoir beaucoup de problèmes liés aux bogues avec Flash Player ( problèmes connus de swfupload ). Le support Mac approprié et le téléchargement via des serveurs proxy avec authentification sont des options dont je ne peux me passer. Cela exclurait probablement toutes les options basées sur Flash :-(.
  • J'élimine toutes les options HTML/Javascript uniquement car vous ne pouvez pas sélectionner plus d'un fichier à la fois avec le contrôle HTML classique. Il est difficile de cliquer plusieurs fois sur le bouton "Parcourir" lorsque vous souhaitez sélectionner plusieurs fichiers dans un dossier.
36
Sébastien Nussbaumer

OK, voici ce que je pense de ceci

J'ai fait quelques tests avec swfupload, et j’ai une expérience antérieure de Java, et ma conclusion est que quelle que soit la technologie utilisée, il n’existe pas de solution parfaite pour les envois sur le navigateur : vous finirez toujours avec des bugs lors du téléchargement de gros fichiers, lors de l'utilisation de proxies, avec SSL, etc ...

MAIS:

  • un uploader flash (à la swfupload) est vraiment léger, n’a pas besoin de l’autorisation de l’utilisateur et a une interface native qui est VRAIMENT cool, pense moi.
  • un téléchargeur Java nécessite une autorisation, mais vous pouvez utiliser les fichiers sélectionnés par l'utilisateur (compression si nécessaire), et le glisser-déposer fonctionne bien. Soyez prêt à déboguer quelques bugs épiques.
  • Je n'ai pas eu le moindre changement pour jouer avec Silverlight aussi longtemps que je le souhaiterais, c'est peut-être la vraie réponse, même si la technologie est encore jeune, alors ... je vais éditer ce post si j'ai l'occasion de jouer un peu avec moi avec Silverlight

Merci pour toutes les réponses !!

4
Sébastien Nussbaumer

J'ai récemment implémenté quelque chose dans Silverlight.

Utilise essentiellement HttpWebRequest pour envoyer un bloc de données à un GenericHandler.

Sur le premier message, 4 Ko de données sont envoyés. Sur le 2ème morceau, j'envoie un autre morceau de 4K.

Lorsque le deuxième bloc est reçu, je calcule l'aller-retour qu'il a fallu entre le premier et le deuxième bloc et ainsi maintenant Le troisième bloc lorsqu'il sera envoyé saura accélérer.

En utilisant cette méthode, je peux télécharger des fichiers de TOUTES tailles et les reprendre.

Chaque message que j'envoie avec cette information:

[PARAMÈTRES] [FILEDATA]

Ici, les paramètres contiennent les éléments suivants: [N ° de morceau] [Nom de fichier] [ID de session]

Une fois que chaque morceau est reçu, j'envoie une réponse à mon Silverlight pour lui dire combien de temps il a fallu pour qu'il puisse maintenant envoyer un plus gros morceau .

Difficile de mettre mon explication sans code mais c'est comme ça que je l'ai fait.

À un moment donné, je rédigerai rapidement un résumé de la façon dont j'ai procédé.

5
Gautam

Je ne l'ai jamais utilisé avec des fichiers de 2 Go, mais le YUI File Uploader fonctionnait assez bien sur un projet précédent. Vous pouvez également être intéressé par ce plugin jQuery .

Cela dit, je pense toujours que l’applet Java est la solution. Je pense que vous aurez moins de problèmes de portabilité et d’interface utilisateur que vous ne le souhaiteriez et le glisser/déposer fonctionne très bien. Pour mémoire, Box.net utilise une applet Java pour ses téléchargements rapides multi-fichiers.

5
slf

Il existe un certain nombre de composants Flash gratuits avec la fonctionnalité de téléchargement de fichiers multiples de Nice. Ils utilisent la classe ActionScripts FileReference avec un récepteur PHP (ou autre) côté serveur. Certains ont récemment rompu avec le lancement de FP10 mais je sais avec certitude que swfupload fonctionnera :)

J'espère que cela t'aides!

3
adam

Et ces deux Jupload http://jupload.sourceforge.net/ Et Jumploader http: //jumploader.com/

Les deux sont des applets Java, mais ils sont également très faciles à utiliser et à mettre en œuvre. 

2
Alos

qu'en est-il google gears ?

1
Thierry

Vous pouvez également télécharger plusieurs fichiers avec des formulaires HTTP, comme Dave l'a déjà souligné, mais si vous êtes prêt à utiliser quelque chose de plus que ce que HTTP et Javascript offrent, je considérerais fortement Flash. Il existe même des solutions préexistantes telles que MultiPowUpload et il offre bon nombre des fonctionnalités que vous recherchez. Il est également plus facile d'obtenir des informations de progression à l'aide d'un client Flash que de AJAX appels depuis Javascript, car vous disposez d'un peu plus de flexibilité.

0
Jay

Vous pouvez vérifier le paquet Apache Commons FileUpload. Il vous permet de télécharger plusieurs fichiers, de surveiller la progression du téléchargement, etc. Vous pouvez trouver plus d'informations ici:

http://commons.Apache.org/fileupload/
http://commons.Apache.org/fileupload/using.html

Bonne chance

0
bouncing_elephant

La manière la plus simple de télécharger des fichiers en Java est la bibliothèque GOJFileUpload.jar

Voici le tutoriel de la bibliothèque gojfileupload:

GOJFileUpload

Ils donnent deux méthode

  • UploadFile (chemin du fichier de chaîne, noms d’images ArrayList, demande HttpRequest)
  • UploadFile (chemin du fichier de chaîne, nom de données ArrayList, noms de fichiers ArrayList , Demande HttpRequest)

Ils vous renverront HashMap le nom de tous les fichiers que vous avez téléchargés après avoir été téléchargés dans votre dossier de destination.

0
Tell Me How

Il existe des contrôles de téléchargement HTTP/HTTPS qui permettent le téléchargement de plusieurs fichiers. Here est l'un de Telerik, que j'ai trouvé solide et fiable. La dernière version semble avoir la plupart, voire toutes les exigences de votre fonctionnalité.

0
Dave Swersky