2012-08-22 1 views
8

Je dois envoyer le fichier et leurs propriétés au serveur GWT.Envoyer le fichier et HashMap au serveur dans GWT

Pour envoyer un fichier j'ai utilisé le panneau de formulaire.

public class BrowseFile extends DialogBox { 
    // more code 
    // .. 

     private FormPanel getFormPanel() { 
       if (formPanel == null) { 
        formPanel = new FormPanel(); 
        formPanel.setMethod(FormPanel.METHOD_POST); 

        formPanel.setEncoding(FormPanel.ENCODING_MULTIPART); 
        formPanel.setAction(GWT.getHostPageBaseURL() +"UploadFileServlet"); 

        formPanel.addSubmitHandler(new FormPanel.SubmitHandler(){ 
         public void onSubmit(SubmitEvent event) { 
          // TODO Auto-generated method stub 
            setFilename(fileUpload.getFilename()); 
         } 

        }); 
       } 
       return formPanel; 
      } 
     } 

toutes les propriétés de ce fichier sont hashmap GUi to add Document

il y a 2 boîte de dialogue Propertybox extends DialogBox et

BrowseFile extends DialogBox 

dans le constructeur de PropertyBox il y a BrowseFile

Lorsque PropertyBox constructeur

   setSize("600px", "670px"); 
    setHTML("Add Document"); 

    setWidget(getVerticalPanel()); 
    browseFile = new BrowseFile(); 

la propriété personnalisée à l'intérieur du PropertyBox dépend de la classe choisie (classe Tree Widget)

côté serveur

public class FileUpload extends HttpServlet implements Servlet{ 

    private static final long serialVersionUID = 1L; 
    private static final Logger log = Logger.getLogger(FileUpload.class 
      .getName()); 
    protected void doGet(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 

     doPost(request, response); 

    } 

    protected void doPost(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 

     byte[] buffer = new byte[115200];// 
     String fileName = null; 
     String mimetype = null; 
     String majorVersion = null; 
     InputStream stream = null; 

     try { 

      ServletFileUpload upload = new ServletFileUpload(); 

      FileItemIterator iterator = upload.getItemIterator(request); 
      while (iterator.hasNext()) { 
       FileItemStream item = iterator.next(); 
       stream = item.openStream(); 

       if (item.isFormField()) { 
     //                  
       } else { 

        fileName = item.getName(); 
        mimetype = item.getContentType(); 

//          
       } 
      } 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     ByteArrayOutputStream output = new ByteArrayOutputStream(); 
     int len; 

     while ((len = stream.read(buffer, 0, buffer.length)) != -1) { 
      output.write(buffer, 0, len); 
     } 
     ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray()); 
     Session session =RootFolder.getSession(); 
     ContentStream contentStream = session.getObjectFactory() 
       .createContentStream(fileName, output.size(), mimetype, input); 


} 

Pour Création d'un document dans le référentiel externe i besoin du document Propriété en hasmap

folder.createDocument (propriété de document, contentStream, VersioningState.MAJOR);

La propriété de document doit être envoyé à cette classe en cas de onClickButton ADD de la propriété Classe de document

***** Comment envoyer ce document propriété au serveur en classe FileUpload *****

Répondre

8

Tout d'abord, je recommande d'utiliser le composant GWTUploader, cela facilite beaucoup la vie.

http://code.google.com/p/gwtupload/

prochaine, vous aurez besoin d'ajouter votre hashmap (clé/valeur) en tant que champs de formulaire, voir

et composant simplement récupérer des champs de formulaire sur côté serveur similaire à la façon vous avez décrit:

  if (item.isFormField()) { 
    //                  
      } else { 

il pourrait ressembler à:

  if (item.isFormField()) { 
       paramsMap.add(item.getName(), item.getValue()) 
      } else { 
+0

Il peut y avoir plus de 200 propriétés. Et ces propriétés dépendent de la classe sélectionnée pour le document. Il existe plus de 50 classes de document. L'ajout de hashMap comme champ de formulaire n'est pas une bonne option et la valeur de hasmap est la classe qui a 3 variables (value, dataType). – NewCodeLearner

+0

@NewCodeLearner Je ne vois pas pourquoi vous ne pouvez pas ajouter des champs de formulaire à la demande - après tout, c'est des données en plusieurs parties et donc il peut gérer un nombre (presque) illimité de champs. Et l'énumération dans HashMap.entrySet n'est pas si grave. Je pourrais conseiller de sérialiser HashMap dans un flux binaire, puis de l'envoyer en tant que données brutes - mais c'est un peu hack et je parie que vous ne le voulez pas. Vous créez des champs dynamiquement pour chaque type de fichier, les marshal dans l'ensemble des champs de formulaire sur le client et unmarshal sur le serveur, obtenir la HashMap ensemble avec le fichier et c'est tout. Logique? Si non, veuillez expliquer pourquoi. – jdevelop

+0

hey je ne suis pas très bon en programmation et en ai très peu connaissance. Je vais essayer wat vous dites. Ensuite, je vais vous faire savoir que je veux la même chose ou pas. Merci. – NewCodeLearner

1

Pourquoi ne pas utiliser une séquence de demandes?

  1. Client: Télécharger un fichier. Utilisez FormPanel.
    serveur: enregistre le fichier et retourne nouveau fileId (en cas de succès)

  2. Client: (à partir onSubmitCompleted) envoie les données de fichiers en même temps que son fileId.Utilisation de la structure de données dont vous avez besoin
    Serveur: stocke les champs d'informations de fichier dans la base de données.

+0

: ce que signifie par nouveau champ. comment le retourner. Pouvez-vous donner un petit exemple. – NewCodeLearner

+0

c'était nouvel ID de fichier, pas "champ" dans mon message – alexp

Questions connexes