web-dev-qa-db-fra.com

Téléchargement de fichier de base dans GWT

J'essaie de comprendre comment télécharger un fichier à l'aide du widget GWTs FileUpload. J'utilise GWT et Google AppEngine avec Java mais je voudrais télécharger un fichier sur mon propre serveur Linux. J'ai déjà le code suivant mais maintenant je ne sais pas comment soumettre mon fichier sur le serveur Google AppServer et enregistrez-le 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? Que dois-je mettre dans web.xml et comment écrire mon servlet pour pouvoir stocker le fichier et renvoyer l'URL de cet objet (si possible)

45
Maksim

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) Ensuite, 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 a fait ceci:

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

Je suggérerais d'utiliser GWTUpload car il est très simple à utiliser et à étendre. Vous pouvez l'ajouter à votre projet en moins de 10 minutes et il prend en charge GAE dès la sortie de la boîte (en utilisant GWTUpload-GAE). Voir exemples pour certains scénarios d'utilisation courants.

11
rluba

Dans GWT, vous pouvez publier le fichier sur le serveur à l'aide des méthodes de formulaire http et vous devez utiliser le HttpServlet fourni pour accepter et enregistrer les données en tant que blogs binaires dans Appengine BigTable.

Ensuite, vous avez besoin d'un deuxième HttpServlet pour lire le fichier à partir de bigtable, définir le type MIME dans l'en-tête HTTP {et les options de mise en cache}, puis diffuser le fichier à l'utilisateur.

Bien que RPC ne soit pas NÉCESSAIREMENT nécessaire, vous devez informer le client de ce qu'est l'ID de fichier généré afin qu'il puisse y accéder {à moins que vous ne vouliez laisser l'utilisateur fournir l'ID et le forcer à s'inquiéter des remplacements de nom ... ... ick} . Soit vous pouvez utiliser rpc pour demander une liste de/single id {comme "le plus récent identifiant de fichier par utilisateur"}, soit vous pouvez renvoyer cet id dans le corps de la réponse du UploadServlet ... mais alors vous devez vous assurer que votre post cible est un iframe sur la page, interrogez pour vous assurer que l'iframe a un corps entre l'événement de soumission et la réponse réelle du serveur, puis analysez et utilisez cet identifiant dans gwt pour créer une balise img ou object qui utilise le fichier.

L'essentiel est d'avoir un servlet à télécharger et un autre à télécharger. N'oubliez pas que BigTable ne stocke que des objets binaires binaires, vous avez donc également besoin que votre entité de données ait un type mime/contenu qui peut être lu à partir du fichier d'entrée {ne vous fiez jamais aux extensions de fichier!}. De plus, il y a 1 Mo par entité dans le BigTable et une limite de 10 Mo pour les comptes gratuits. Vous souhaiterez peut-être que votre entité de données contienne une liste de 1 à 10 objets blob, chacun de 1 024 octets maximum.

Fondamentalement, votre meilleur pari est de trouver une copie de travail gratuite, comme Google File Service, et de l'étendre pour apprendre comment fonctionne le système.

Si vous le souhaitez, je publierai ma propre version open source de la gestion des fichiers, une fois que j'aurai terminé les widgets de contrôle gwt et que je pourrai le considérer comme suffisamment stable pour être utile à n'importe qui. Envoyez un e-mail x À aiyx POINT info si vous voulez que je vous envoie un pot de code betalicious.

5
Alyxandor

À moins que vous n'utilisiez déjà d'autres frameworks, je vous suggère fortement d'utiliser Vanilla GWT ordinaire et ses composants natifs. Si vous utilisez d'autres frameworks, vous pouvez considérablement exploser la taille de votre application.

L'utilisation des composants natifs peut se faire en 3 étapes:

  1. Créer un servlet de téléchargement de fichiers
  2. Modifier web.xml
  3. Créer un formulaire de téléchargement GWT

Chose intéressante, la partie GWT est la plus simple. Vous pouvez copier mon code sur GWT Upload en 3 étapes faciles si vous le souhaitez. Téléchargement heureux!

2
Jeff Richley

Ici, vous allez avec un complet GFT fileupload avec barre de progression

enter image description here

Ici, vous pouvez [~ # ~] télécharger [~ # ~] la source

1
Suresh Atta