2009-02-24 11 views
36

Sto lavorando su un'applicazione web. C'è un posto dove l'utente può caricare file con il protocollo HTTP. C'è una scelta tra il classico controllo del caricamento dei file HTML e un applet Java per caricare i file.Il modo migliore per caricare più file da un browser

Il caricamento di file HTML classico non è eccezionale perché è possibile selezionare un solo file alla volta ed è piuttosto difficile ottenere indicazioni di avanzamento durante il caricamento effettivo (finalmente l'ho ottenuto utilizzando un timer che aggiorna un indicatore di avanzamento con dati recuperati dal server tramite una chiamata AJAX). Il vantaggio: funziona sempre.

Con l'applet Java posso fare più cose: selezionare più file contemporaneamente (anche una cartella), comprimere i file, ottenere una vera barra di avanzamento, trascinare i file sull'applet, ecc ...
ma ci sono alcuni inconvenienti:

  • è un incubo per farlo funzionare correttamente su Mac Safari e Mac Firefox (Grazie LiveConnect)
  • l'interfaccia utente non è esattamente il nativo interfaccia utente e alcune persone notare che
  • l'applet non è reattivo come dovrebbe (potrebbe essere colpa mia, ma tutto mi sembra ok)
  • ci sono errori nella classe Java UrlConnection con HTTPS, quindi utilizzo il client HTTP comune Apache per eseguire il caricamento HTTP effettivo. E 'abbastanza grande un pacchetto e rallenta il download del file .jar
  • il cliente comune HTTP Apache a volte ha difficoltà a passare attraverso i proxy
  • il runtime Java è abbastanza grande

Sono stato il mantenimento di questa Applet Java per un po 'ma ora sono stufo di tutti gli inconvenienti, e considerando di scrivere/acquistare un componente completamente nuovo per caricare questi file.

Domanda

Se tu avessi i seguenti requisiti:

  • caricare più file facilmente da un browser, tramite HTTP o HTTPS
  • comprimere i file per ridurre il tempo di caricamento
  • il caricamento dovrebbe funzionare su qualsiasi piattaforma, con l'interfaccia utente nativa
  • deve essere in grado di caricare file enormi, fino a 2 GB a t almeno
  • avete carta bianca sulla tecnologia

Quale tecnologia/compontent useresti?


Edit:

  • Drag'n'Drop di file sul componente sarebbe un grande vantaggio.
  • Sembra che ci siano molti problemi relativi ai bug con Flash Player (swfupload known issues). Il supporto Mac corretto e il caricamento tramite proxy con autenticazione sono opzioni di cui non posso fare a meno. Questo probabilmente escluderebbe tutte le opzioni basate su Flash :-(.
  • Escludo tutte le opzioni HTML/Javascript-only perché non è possibile selezionare più di un file alla volta con il controllo HTML classico. È difficile fare clic su n volte il pulsante "sfoglia" quando si desidera selezionare più file in una cartella.
+2

E i caricamenti ripristinabili? Sembra davvero importante per me.A nessuno piace riavviare un caricamento che ha avuto esito negativo dopo un paio d'ore. –

+0

È vero, in questo caso non penso che tu possa ancora usare Flash, solo Java (e Silverlight?) –

+0

Ciao un altro Uploader basato su Flash è disponibile su http://digitarald.de/project/fancyupload/ –

risposta

4

OK questo è il mio prendere su questo

ho fatto alcuni test con swfupload, e ho la mia precedente esperienza con Java, e la mia conclusione è che qualunque tecnologia è utilizzata non esiste una soluzione perfetta per fare caricamenti sul browser: si finisce sempre con gli insetti durante il caricamento di file di grandi dimensioni, passando attraverso i proxy, con SSL, ecc ...

MA:

  • un uploader flash (a la swfupload) è davvero leggero, non ha bisogno dell'autorizzazione dell'utente e ha un'interfaccia nativa che è VERAMENTE fighissima, mi sembra
  • un java uploader ha bisogno di autorizzazione ma puoi fare quello che vuoi con i file selezionati dall'utente (ovvero la compressione se necessario) e il trascinamento funzionano bene. Preparati per alcuni bug epic debuggin 'però.
  • Non ho avuto una modifica per giocare con Silverlight finché mi piacerebbe che fosse la vera risposta, anche se la tecnologia è ancora abbastanza giovane quindi ... Modificheremo questo post se avrò la possibilità di giocherellare un po 'con Silverlight

Grazie per tutte le risposte !!

+1

Una nota per le persone che trovano questa risposta dopo alcuni anni. Abbiamo utilizzato SWFUpload per anni e, in generale, funziona davvero bene. Una cosa da notare è che poiché Flash Player 9 non invia intestazioni di autorizzazione, quindi non funzionerà se si utilizza l'autenticazione integrata di Windows o un server proxy che richiede l'autenticazione. Per questo motivo ci siamo spostati su una soluzione basata su HTML5. –

0

Esistono controlli di caricamento HTTP/HTTPS che consentono il caricamento di più file. Here è uno di Telerik, che ho trovato solido e affidabile. L'ultima versione sembra avere la maggior parte se non tutti i requisiti delle funzionalità.

+0

a differenza di altri Uploader AJAX, questo è legato a .NET, rendendolo inutile – Javier

+0

Inoltre, non è possibile selezionare un file alla volta. Forse volevi parlare del controllo upload di silverlight telerik –

3

Esistono numerosi componenti flash gratuiti che esistono con una buona capacità di caricamento di file multipli. Fanno uso della classe FileReference di ActionScript con un ricevitore PHP (o qualsiasi altra cosa) sul lato server. Alcuni hanno recentemente rotto con il lancio del FP10 ma so per certo che swfupload funzionerà :)

Spero che questo aiuti!

0

È possibile caricare più file anche con moduli HTTP, come già rilevato da Dave, ma se si è deciso di utilizzare qualcosa oltre a ciò che offre HTTP e Javascript, considererei pesantemente Flash. Esistono anche soluzioni preesistenti come ad esempio MultiPowUpload e offre molte delle funzioni che stai cercando. È anche più facile ottenere informazioni sull'avanzamento utilizzando un client Flash rispetto alle chiamate AJAX da JavaScript poiché si ha un po 'più di flessibilità.

0

È possibile controllare il pacchetto FileUpload di Apache Commons. Ti consente di caricare più file, monitorare lo stato di avanzamento del caricamento e altro ancora. E 'possibile trovare maggiori informazioni qui:

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

Buona fortuna

+1

Apache Commons Fileupload è una libreria lato server java utilizzata per analizzare un post http per il caricamento di file. Ho già quel pezzo in funzione. Mi sto davvero concentrando sulla parte client. –

5

ho implementato qualcosa di molto di recente in Silverlight.

Fondamentalmente utilizza HttpWebRequest per inviare una porzione di dati a un GenericHandler.

Sul primo post, vengono inviati 4 KB di dati. Nel secondo pezzo, invio un altro chunk di 4K.

Quando si riceve il 2 ° pezzo, ho calcolare il viaggio di andata ha preso tra il primo e il secondo pezzo, e così ora il 3 ° pezzo quando vengono inviati saprà per aumentare la velocità.

Utilizzando questo metodo posso caricare file di QUALSIASI taglia e posso riprendere.

Ogni post mando lungo questa info:

[PARAMETRI] [FILEDATA]

Qui, i parametri contengono quanto segue: [Chunk #] [Nome] [Session ID]

Dopo aver ricevuto ogni blocco, invio una risposta al mio Silverlight che dice quanto è stato veloce in modo che possa ora inviare un chunk più grande .

Difficile mettere la mia spiegazione senza codice ma fondamentalmente è come l'ho fatto.

A un certo punto metterò insieme una rapida recensione su come l'ho fatto.

+0

Sembra fantastico, voglio provare anche a fare questo. Mi piace che possiamo finalmente manipolare i file sul lato client usando il codice gestito! Long Live Silverlight! – TJB

+0

Ti sei imbattuto in problemi all'interno del player siverlight in merito a cookie cookie manager, proxy, supporto piattaforma? –

+0

Silverlight viene eseguito sul lato client e il mio gestore di caricamento è lato server. Dal momento che sono entrambi distaccati dalla sessione, passerei l'ID della sessione a Silverlight all'avvio. Durante il caricamento, la sessione viene passata da Silverlight al gestore, mantenendo così tutto all'interno di una sessione – Gautam

5

Non l'ho mai usato con file da 2 GB, ma lo YUI File Uploader ha funzionato piuttosto bene su un progetto precedente. Potrebbe interessarti anche questo jQuery Plugin.

Detto questo, penso ancora che l'applet Java sia la strada da percorrere. Penso che ti ritroverai con meno problemi di portabilità e interfaccia utente di quanto ti aspetti e Drag/Drop funziona alla grande. Per la cronaca, Box.net utilizza un'applet Java per i loro caricamenti rapidi multi-file.

+0

Box.net utilizza un componente flash come prima opzione per i loro caricamenti. Tale componente fornisce quindi un collegamento a un'applet java per gli utenti che desiderano utilizzare "drag'n'drop" –

1

che dire di google gears?

+0

Buona idea, ma quello che fa un po 'paura è che non è supportato su Mac OS X Snow Leopard: Snow Leopard è uscito per 2 mesi !! Lo proverò su Firefox al più presto per curiosità;) Grazie! –

2

Che dire di questi due JUpload http://jupload.sourceforge.net/ e jumploader http://jumploader.com/

Entrambi sono applet Java, ma sono anche sia veramente facile da usare e da implementare.

+0

Sì, ho già sentito parlare di JUpload, non ho mai avuto la possibilità/il tempo di sottopormi a prove di stress. So che caricare su https è il problema in generale (il problema sta nell'implementazione JDK stessa. Se JUpload utilizza l'implementazione predefinita probabilmente soffre del problema). –

+0

Informazioni su Jumploader: l'interfaccia utente sembra davvero carina, sembra supportare HTTP. Vale la pena dare un'occhiata a mio parere :) –

0

Il modo più semplice di caricamento di file in java è GOJFileUpload.jar biblioteca

Ecco il tutorial libreria gojfileupload:

GOJFileUpload

danno due metodo

  • UploadFile (String percorsofile , Imagenames di ArrayList, richiesta HttpRequest)
  • UploadFile (String filepath , DataName ArrayList, ArrayList imagenames, HttpRequest richiesta)

torneranno si hashmap tutto il nome del file che hai caricato dopo il caricamento a vostra cartella di destinazione data.