2012-08-22 13 views
8

Devo inviare il file e le relative proprietà al server GWT.Invio di file e HashMap al server in GWT

Per l'invio di un file ho utilizzato il pannello dei moduli.

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

tutte le proprietà di questo file sono in hashmap GUi to add Document

ci sono finestra di dialogo 2 Propertybox extends DialogBox e

BrowseFile extends DialogBox 

all'interno del costruttore della PropertyBox c'è BrowseFile

Quando PropertyBox costruttore

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

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

la proprietà personalizzata all'interno del PropertyBox dipende dalla classe selezionata (classe è albero Widget)

Sul lato server

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


} 

per creare un documento nel repository esterni ho bisogno di documenti di proprietà in hasmap

folder.createDocument (Proprietà documento, contentStream, VersioningState.MAJOR);

La proprietà documento dovrebbe essere inviare a questa classe su onClick caso di Button ADD del documento proprietà Class

***** Come inviare l'immobile documento al server in classe FileUpload *****

risposta

8

Prima di tutto, consiglierei di utilizzare il componente GWTUploader, facilitando notevolmente la vita.

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

successivo, è necessario aggiungere il hashmap (chiave/valore), come i campi del modulo, vedi

e semplicemente recuperare i campi del modulo sul lato server componente simile al modo in cui hai descritto:

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

potrebbe assomigliare:

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

Ci possono essere più le 200 proprietà. E questa proprietà dipende dalla classe selezionata per il documento e ci sono più di 50 classi di documenti. Quindi aggiungere la hashMap come campo modulo non è una buona opzione e anche la parte di valore di hasmap è una classe che ha 3 variabili (valore, dataType). – NewCodeLearner

+0

@NewCodeLearner Non vedo perché non è possibile aggiungere campi modulo alla richiesta, dopotutto sono dati multipart e quindi possono gestire (quasi) un numero illimitato di campi. E l'enumerazione su HashMap.entrySet non è un grosso problema. Potrei consigliare di serializzare HashMap in un flusso binario e poi inviarlo come dati grezzi - ma questo è un pò di hack e scommetto che non lo vuoi. Si creano campi dinamicamente per ogni tipo di file, li si effettua il marshalling in set di campi modulo sul client e unmarshal sul server, si ottiene l'HashMap insieme al file- e il gioco è fatto. Ha senso? Se no, per favore spiega, perché. – jdevelop

+0

hey non sono molto bravo in programmazione e ne ho poca conoscenza. Proverò wat che stai dicendo. Allora ti farò sapere che voglio lo stesso o no. Grazie. – NewCodeLearner

1

Perché non utilizzare una sequenza di richieste?

  1. Cliente: caricare un file. Utilizzare FormPanel.
    Server: salva il file e restituisce nuova fileId (in caso di successo)

  2. Cliente: (da onSubmitCompleted) invia i dati del file insieme alla sua fileId.Utilizza qualsiasi struttura dati necessaria
    Server: memorizza i campi di informazioni sui file in DB.

+0

: cosa significa per nuovo campo. come restituirlo. Puoi dare un piccolo esempio. – NewCodeLearner

+0

era il nuovo ID file, non "campo" nel mio messaggio – alexp