46 votes

Envoi de fichier de base dans GWT

Je suis à essayer de comprendre comment faire pour télécharger un fichier à l'aide de GWTs FileUpload widget. Je suis en utilisant GWT et Google AppEngine avec Java, mais je voudrais télécharger un fichier pour mon propre serveur Linux. J'ai le code suivant déjà, mais maintenant je ne peux pas comprendre comment soumettre mon dossier à la Google du serveur d'applications serveur et de les enregistrer sur un autre serveur:

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;
    }
}

Maintenant, que dois-je faire ensuite? De quoi ai-je besoin de mettre en web.xml et comment dois-je rédiger ma servlet afin que je puisse stocker des fichiers et d'url de retour de l'objet (si possible)

57voto

KevMo Points 2606

Voici le code de mon application:

1) J'ai créé une classe pour accepter la requête 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) Puis, dans mon web.xml, j'ai ajouté ces lignes:

 <servlet>
    <servlet-name>fileUploaderServlet</servlet-name>
    <servlet-class>com.testapp.server.FileUpload</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>fileUploaderServlet</servlet-name>
  <url-pattern>/testapp/fileupload</url-pattern>
</servlet-mapping>
 

3) Et pour form.action fait ceci:

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

11voto

racha Points 1341

Je suggérerais d'utiliser GWTUpload car il est extrêmement simple à utiliser et à étendre. Vous pouvez l'ajouter à votre projet en moins de 10 minutes et il prend en charge dès maintenant le format GAE (à l'aide de GWTUpload-GAE). Voir les exemples pour quelques scénarios d'utilisation courants.

4voto

Tiger Points 364

2voto

Jeff Richley Points 194

Sauf si vous utilisez déjà d'autres cadres, j'avais suggèrent fortement à l'aide de la plaine de vanille GWT et composants natifs. Si vous utilisez d'autres cadres, vous pouvez faire exploser la taille de votre application grandement.

En utilisant les composants natifs peut être fait en 3 étapes:

  1. Créer un fichier de téléchargement servlet
  2. Modifier web.xml
  3. Faire une GWT Formulaire de Téléchargement

Fait intéressant à noter, le GWT est la partie la plus facile. Vous pouvez copier mon code GWT Télécharger en 3 étapes faciles si vous le souhaitez. Heureux le téléchargement!

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