2012-08-22 28 views
8

Tôi phải gửi tệp và thuộc tính của chúng đến máy chủ GWT.Gửi tệp và HashMap tới máy chủ trong GWT

Để gửi tệp, tôi đã sử dụng bảng biểu mẫu.

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

tất cả các thuộc tính của tập tin này đang trong HashMap GUi to add Document

có 2 hộp thoại Propertybox extends DialogBox

BrowseFile extends DialogBox 

bên trong constructor của PropertyBox có BrowseFile

Khi PropertyBox hàm tạo

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

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

Các tài sản tùy chỉnh bên trong PropertyBox phụ thuộc vào lớp chọn (Class là cây Widget)

Mở Server Side

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


} 

Để Tạo một tài liệu trong kho lưu trữ bên ngoài tôi cần tài liệu về tài sản trong hasmap

folder.createDocument (Thuộc tính tài liệu, contentStream, VersioningState.MAJOR);

Thuộc tính tài liệu phải được gửi cho lớp này trên onClick trường hợp Button ADD của tài liệu bất động sản Lớp

***** Làm thế nào để gửi tài sản tài liệu này đến máy chủ trong lớp FileUpload *****

Trả lời

8

Trước hết, tôi khuyên bạn nên sử dụng thành phần GWTUploader, nó giúp giảm bớt cuộc sống rất nhiều.

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

tiếp theo, bạn sẽ cần thêm hashmap của bạn (key/value) là lĩnh vực hình thức, xem

và chỉ đơn giản là lấy trường biểu mẫu trên server-side thành phần tương tự như cách bạn đã mô tả:

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

nó có thể trông giống như:

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

Có thể có thêm 200 thuộc tính. Và các thuộc tính này phụ thuộc vào lớp được chọn cho tài liệu. Và có hơn 50 lớp tài liệu. SO thêm hashMap như trường mẫu không phải là một lựa chọn tốt và cũng có giá trị một phần của hasmap là lớp có 3 biến (giá trị, kiểu dữ liệu). – NewCodeLearner

+0

@NewCodeLearner Tôi không thấy lý do tại sao bạn không thể thêm trường biểu mẫu vào yêu cầu - sau khi tất cả, đó là dữ liệu nhiều phần và do đó nó có thể xử lý (gần như) số lượng trường không giới hạn. Và liệt kê trên HashMap.entrySet không phải là vấn đề lớn. Tôi có thể tư vấn để serialize HashMap vào một số dòng nhị phân và sau đó gửi nó như là dữ liệu thô - nhưng đây là kinda của hack và tôi đặt cược bạn không muốn điều này. Bạn tạo trường động cho từng loại tệp, sắp xếp chúng thành tập hợp các trường biểu mẫu trên máy khách và không đối sánh trên máy chủ, lấy HashMap cùng với tệp- và đó là nó. Có ý nghĩa? Nếu không - vui lòng giải thích, tại sao. – jdevelop

+0

hey i am không vry tốt trong lập trình và có rất ít kiến ​​thức về nó. Tôi sẽ cố gắng wat bạn đang nói. Sau đó, tôi sẽ cho bạn biết tôi muốn giống nhau hay không. Cảm ơn. – NewCodeLearner

1

Tại sao không sử dụng một chuỗi yêu cầu?

  1. Khách hàng: Tải tệp lên. Sử dụng FormPanel.
    Server: lưu các tập tin và trả fileId mới (nếu thành công)

  2. Chủ đầu tư: (từ onSubmitCompleted) gửi dữ liệu hồ sơ của cùng với fileId của nó.Sử dụng bất kỳ cấu trúc dữ liệu nào bạn cần
    Máy chủ: lưu trữ các trường thông tin tệp vào DB.

+0

: ý nghĩa của trường mới. cách trả lại. Bạn có thể đưa ra một ví dụ nhỏ không. – NewCodeLearner

+0

đó là ID tệp mới, không phải là "trường" trong thư của tôi – alexp

Các vấn đề liên quan