2012-08-22 11 views
8

Tengo que enviar el archivo y sus propiedades al servidor GWT.Enviando archivo y HashMap al servidor en GWT

Para enviar un archivo utilicé el panel de formulario.

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

todas las propiedades de este archivo están en Hashmap GUi to add Document

hay 2 cuadro de diálogo Propertybox extends DialogBox y

BrowseFile extends DialogBox 

dentro del constructor de PropertyBox hay BrowseFile

Cuando PropertyBox constructor

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

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

la propiedad personalizada en el interior del PropertyBox depende de la clase seleccionada (clase es Widget árbol)

En el lado del servidor

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


} 

para crear un documento en el repositorio externo que necesito de propiedades de documento en hasmap

folder.createDocument (Document Property, contentStream, VersioningState.MAJOR);

La propiedad de documento se debe enviar a esta clase de onClick caso de Button ADD del Documento Clase propiedad

***** ¿Cómo enviar esta propiedad de documento con el servidor en FileUpload clase *****

Respuesta

8

En primer lugar, recomendaría utilizar el componente GWTUploader, facilita mucho la vida.

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

próximo, tendrá que añadir su HashMap (clave/valor) como campos de formulario, ver

y simplemente recuperar los campos de formulario en el lado del servidor componente similar a la forma usted describió:

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

puede ser que parezca:

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

Puede haber más de 200 propiedades. Y estas propiedades dependen de la clase seleccionada para el documento. Y hay más de 50 clases de documentos. SO agregar el hashMap como campo de formulario no es una buena opción y también valorar parte de hasmap es una clase que tiene 3 variables (value, dataType). – NewCodeLearner

+0

@NewCodeLearner No veo por qué no puede agregar campos de formulario a la solicitud; después de todo, son datos multiparte y, por lo tanto, puede manejar (casi) un número ilimitado de campos. Y la enumeración a través de HashMap.entrySet no es tan importante. Podría aconsejar serializar HashMap en algún flujo binario y luego enviarlo como datos sin procesar, pero esto es un poco de pirateo y apuesto a que no quieres esto. Crea campos dinámicamente para cada tipo de archivo, los clasifica en un conjunto de campos de formulario en el cliente y los elimina en el servidor, obtiene el HashMap junto con el archivo, y eso es todo. ¿Tiene sentido? Si no, por favor explique por qué. – jdevelop

+0

hey no soy muy bueno en programación y tengo muy poco conocimiento de ello. Voy a intentar lo que estás diciendo. Entonces te haré saber que quiero lo mismo o no. Gracias. – NewCodeLearner

1

¿Por qué no utilizar una secuencia de solicitudes?

  1. Cliente: Subir un archivo. Use FormPanel.
    servidor: guarda el archivo y devuelve la nueva fileId (si tiene éxito)

  2. Cliente: (de onSubmitCompleted) envía datos de archivos junto con su fileId.Use la estructura de datos que necesite
    Servidor: almacena los campos de información de archivos en DB.

+0

: qué quiere decir campo nuevo. cómo devolverlo ¿Puedes dar un pequeño ejemplo? – NewCodeLearner

+0

era una nueva identificación de archivo, no "campo" en mi mensaje – alexp

Cuestiones relacionadas