Téléchargement de fichier de base dans GWT

J’essaie de comprendre comment télécharger un fichier en utilisant le widget FileUpload de GWT. 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 n’arrive pas à comprendre comment soumettre mon fichier au serveur Google AppServer et l’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? Que dois-je mettre dans web.xml et comment puis-je écrire mon servlet afin de pouvoir stocker le fichier et renvoyer l’URL de cet object (si possible)

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(); Ssortingng 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:

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

3) Et pour form.action a fait ceci:

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

Je suggère d’utiliser GWTUpload car il est simple à utiliser et à prolonger. Vous pouvez l’append à votre projet en moins de 10 minutes et il prend en charge GAE immédiatement (en utilisant GWTUpload-GAE). Voir les exemples pour certains scénarios d’utilisation courants.

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 sous forme de blogs binarys dans Appengine BigTable.

Ensuite, vous avez besoin d’un deuxième HttpServlet pour lire le fichier depuis bigtable, SET THE MIME TYPE DANS HTTP HEADER {et les options de mise en cache}, puis diffuser le fichier vers l’utilisateur.

Bien que RPC ne soit PAS NECESSAIREMENT nécessaire, vous devez informer le client du fichierId généré pour qu’il puisse y accéder {à moins que vous souhaitiez laisser l’utilisateur fournir l’ID et le forcer à s’inquiéter des remplacements de noms … ick} . Soit vous pouvez utiliser rpc pour demander une liste de / identifiant unique {comme “identifiant de fichier le plus récent par utilisateur”}, ou vous pouvez renvoyer cet identifiant dans le corps de la réponse de UploadServlet … est un iframe dans la page poll pour vous assurer que l’iframe a un corps entre l’événement submit et la réponse du serveur, puis parsingr et utiliser cet identifiant dans gwt pour créer une balise img ou object qui utilise le fichier.

La clé est d’avoir un servlet à télécharger et un autre à télécharger. Rappelez-vous que BigTable ne stocke que les blobs binarys, vous avez donc besoin que votre entité de données ait un Type mime / contenu qui puisse être lu depuis le fichier d’entrée {ne comptez jamais sur les extensions de fichiers!}. En outre, il y a un 1 Mo par entité dans le BigTable, et une limite de demande de 10 Mo pour les comptes gratuits. Vous souhaiterez peut-être que votre entité de données contienne une liste de 1 à 10 blobs, chacun représentant un maximum de 1024 octets.

Fondamentalement, votre meilleur pari est de trouver une copie de travail, gratuite, comme le service de fichiers Google, 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 je finis les widgets de contrôle de gwt et que je pourrai considérer cela comme suffisamment stable pour être utile à tous. Email x AT aiyx informations DOT si vous voulez que je vous envoie un pot de code betalicious.

A moins que vous n’utilisiez déjà d’autres frameworks, je vous suggère fortement d’utiliser GWT ordinaire et ses composants natifs. Si vous utilisez d’autres frameworks, vous pouvez exploser considérablement 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 fichier
  2. Modifier web.xml
  3. Faire un formulaire de téléchargement GWT

Fait intéressant, la partie GWT est la plus facile. Vous pouvez copier mon code dans GWT Upload en 3 étapes faciles si vous le souhaitez. Bon téléchargement!

Ici vous allez avec un téléchargement complet GWT avec barre de progression

entrer la description de l'image ici

Ici vous pouvez télécharger la source