Caricamento di file di base in GWT

Sto cercando di capire come caricare un file utilizzando il widget FileUpload di GWT. Sto usando GWT e Google AppEngine con Java, ma vorrei caricare il file sul mio server Linux. Ho già il seguente codice ma ora non riesco a capire come inviare il mio file al server di Google AppServer e salvarlo su un altro server:

public class FileUploader{ private ControlPanel cp; private FormPanel form = new FormPanel(); private FileUpload fu = new FileUpload(); public FileUploader(ControlPanel cp) { this.cp = cp; this.cp.setPrimaryArea(getFileUploaderWidget()); } @SuppressWarnings("deprecation") public Widget getFileUploaderWidget() { form.setEncoding(FormPanel.ENCODING_MULTIPART); form.setMethod(FormPanel.METHOD_POST); // form.setAction(/* WHAT SHOULD I PUT HERE */); VerticalPanel holder = new VerticalPanel(); fu.setName("upload"); holder.add(fu); holder.add(new Button("Submit", new ClickHandler() { public void onClick(ClickEvent event) { GWT.log("You selected: " + fu.getFilename(), null); form.submit(); } })); form.addSubmitHandler(new FormPanel.SubmitHandler() { public void onSubmit(SubmitEvent event) { if (!"".equalsIgnoreCase(fu.getFilename())) { GWT.log("UPLOADING FILE????", null); // NOW WHAT???? } else{ event.cancel(); // cancel the event } } }); form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() { public void onSubmitComplete(SubmitCompleteEvent event) { Window.alert(event.getResults()); } }); form.add(holder); return form; } } 

Ora, cosa devo fare dopo? Cosa devo inserire in web.xml e come posso scrivere il mio servlet in modo da poter archiviare il file e restituire l’URL di quell’object (se ansible)

Ecco il codice dalla mia app:

1) Ho creato una class per accettare la richiesta http:

 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItemIterator; import org.apache.commons.fileupload.FileItemStream; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUpload extends HttpServlet{ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletFileUpload upload = new ServletFileUpload(); try{ FileItemIterator iter = upload.getItemIterator(request); while (iter.hasNext()) { FileItemStream item = iter.next(); String name = item.getFieldName(); InputStream stream = item.openStream(); // Process the input stream ByteArrayOutputStream out = new ByteArrayOutputStream(); int len; byte[] buffer = new byte[8192]; while ((len = stream.read(buffer, 0, buffer.length)) != -1) { out.write(buffer, 0, len); } int maxFileSize = 10*(1024*1024); //10 megs max if (out.size() > maxFileSize) { throw new RuntimeException("File is > than " + maxFileSize); } } } catch(Exception e){ throw new RuntimeException(e); } } } 

2) Poi nel mio web.xml ho aggiunto queste righe:

  fileUploaderServlet com.testapp.server.FileUpload   fileUploaderServlet /testapp/fileupload  

3) E per form.action ha fatto questo:

 form.setAction(GWT.getModuleBaseURL()+"fileupload"); 

Ti suggerirei di utilizzare GWTUpload perché è praticamente semplice da utilizzare ed estendere. Puoi aggiungerlo al tuo progetto in meno di 10 minuti e supporta GAE immediatamente (utilizzando GWTUpload-GAE). Vedere gli esempi per alcuni scenari di utilizzo comuni.

In GWT, puoi inviare il file al server utilizzando i metodi di modulo http e devi utilizzare HttpServlet in dotazione per accettare e salvare i dati come blog binari in Appengine BigTable.

Quindi, è necessario un secondo HttpServlet per leggere il file da bigtable, IMPOSTA IL TIPO MIME NELL’HTAD HEADER {e le opzioni di memorizzazione nella cache}, quindi eseguire il stream del file all’utente.

Sebbene RPC non sia NECESSARIAMENTE necessario, è necessario consentire al client di sapere quale sia l’ID file generato in modo che possano accedervi {a meno che non si desideri consentire all’utente di fornire l’ID e costringerlo a preoccuparsi delle sostituzioni del nome … … ick} . O puoi usare rpc per chiedere un elenco di / id singolo {come “l’ultimo ID di file per utente”}, oppure puoi restituire quell’id nel corpo della risposta di UploadServlet … ma poi devi assicurarti che il tuo post sia target è un iframe in-page, un sondaggio per assicurarsi che l’iframe abbia un corpo tra l’evento di invio e l’effettiva risposta del server, quindi analizzare e utilizzare quell’ID in gwt per creare un tag img o object che utilizza il file.

La parte chiave è avere un servlet da caricare e un altro da scaricare. Ricorda, BigTable memorizza solo blob binari, quindi hai anche bisogno che la tua quadro dati abbia un tipo mime / contenuto che può essere letto dal file di input {non fare mai affidamento sulle estensioni di file!}. Inoltre, c’è un 1 MB per quadro nella BigTable e un limite di richiesta di 10 MB per gli account gratuiti. Potresti desiderare che la tua quadro di dati contenga un elenco di 1-10 blob, ognuno dei quali è un massimo di 1024 byte.

Fondamentalmente, la soluzione migliore è trovare una copia funzionante e gratuita, come Google File Service, ed estenderla per scoprire come funziona il sistema.

Se lo desideri, pubblicherò la mia versione open-source di gestione dei file, una volta che avrò finito i widget di controllo gwt e posso considerarlo abbastanza stabile da essere utile a chiunque. Email x AT AIyx DOT info se vuoi che ti mandi un barattolo di codice betalicious.

A meno che tu non stia già utilizzando altri framework, ti ​​suggerisco caldamente di utilizzare il semplice GWT di vaniglia e i suoi componenti nativi. Se si utilizzano altri framework, è ansible esplodere notevolmente le dimensioni dell’applicazione.

L’utilizzo dei componenti nativi può essere fatto in 3 passaggi:

  1. Crea un servlet per il caricamento di file
  2. Modifica web.xml
  3. Crea un modulo di caricamento GWT

È interessante notare che la parte GWT è la più semplice. Puoi copiare il mio codice su GWT Upload in 3 semplici passaggi se lo desideri. Felice caricamento!

Ecco qui un fileupload GWT completo con barra di avanzamento

inserisci la descrizione dell'immagine qui

Qui puoi SCARICARE la fonte