GWT

2012-08-22 14 views
8

में सर्वर पर फ़ाइल और हैश मैप भेजना मुझे फ़ाइल और उनके गुण GWT सर्वर पर भेजना है।GWT

फ़ाइल भेजने के लिए मैंने फॉर्म पैनल का उपयोग किया।

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

सब इस फाइल के गुणों HashMap में हैं GUi to add Document

2 संवाद बॉक्स Propertybox extends DialogBox और

BrowseFile extends DialogBox 

PropertyBox के निर्माता के अंदर हैं वहाँ BrowseFile

जब PropertyBox निर्माता

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

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

PropertyBox अंदर कस्टम संपत्ति वर्ग का चयन किया पर निर्भर करता है

सर्वर साइड

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


} 

बाहरी भंडार में एक दस्तावेज़ बना रहा के लिए पर (कक्षा पेड़ विजेट है) मैं में दस्तावेज़ संपत्ति की जरूरत है हैसम

फ़ोल्डर.क्रेट दस्तावेज़ (दस्तावेज़ संपत्ति, सामग्री स्ट्रीम, वर्जनिंगस्टेट.एमजेओआर);

दस्तावेज़ संपत्ति दस्तावेज संपत्ति वर्ग के Button ADD की onClick घटना पर इस वर्ग के लिए भेज दिया जाना चाहिए

***** कैसे वर्ग FileUpload में सर्वर के लिए इस दस्तावेज़ संपत्ति भेजने के लिए *****

उत्तर

8

सबसे पहले, मैं GWTUploader घटक का उपयोग करने की अनुशंसा करता हूं, यह जीवन को बहुत आसान बनाता है।

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

अगले, आप प्रपत्र फ़ील्ड्स के रूप में अपने hashmap (कुंजी/मान) जोड़ने

की आवश्यकता होगी, देखते हैं और बस सर्वर साइड पर प्रपत्र फ़ील्ड्स को पुनः प्राप्त घटक रास्ता के समान आप वर्णित:

:

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

यह कैसा लग सकता है

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

200 से अधिक गुण हो सकते हैं। और ये संपत्ति दस्तावेज़ के लिए चुनी गई कक्षा पर निर्भर करती है। और 50 से अधिक दस्तावेज़ वर्ग हैं। इसलिए हैश मैप को फॉर्म फ़ील्ड के रूप में जोड़ना एक अच्छा विकल्प नहीं है और हैसमैप का मूल्य हिस्सा वर्ग है जिसमें 3 चर (मान, डेटा टाइप) है। – NewCodeLearner

+0

@NewCodeLearner मुझे नहीं लगता कि आप अनुरोध में फॉर्म फ़ील्ड क्यों नहीं जोड़ सकते हैं - आखिरकार, यह डेटा मल्टीपार्ट है और इस प्रकार यह असीमित संख्या में फ़ील्ड को संभाल सकता है। और HashMap.entrySet भर में गणना उस बड़े सौदे नहीं है। मैं कुछ बाइनरी स्ट्रीम में हैश मैप को क्रमबद्ध करने के लिए सलाह दे सकता हूं और फिर इसे कच्चे डेटा के रूप में भेज सकता हूं - लेकिन यह हैक की तरह है और मुझे यकीन है कि आप यह नहीं चाहते हैं। आप प्रत्येक प्रकार की फ़ाइल के लिए गतिशील रूप से फ़ील्ड्स बनाते हैं, उन्हें क्लाइंट पर फॉर्म फ़ील्ड्स के सेट में मार्शल करते हैं और सर्वर पर अनारशल करते हैं, हैश मैप फ़ाइल के साथ मिलते हैं- और यही वह है। समझ में आता है? यदि नहीं - कृपया समझाओ, क्यों। – jdevelop

+0

हे, मैं प्रोग्रामिंग में अच्छा नहीं हूं और इसके बारे में बहुत कम ज्ञान नहीं है। मैं कोशिश करूँगा कि आप कह रहे हैं। तो मैं आपको बता दूंगा कि मैं वही चाहता हूं या नहीं.धन्यवाद। – NewCodeLearner

1

अनुरोधों के अनुक्रम का उपयोग क्यों नहीं करते?

  1. ग्राहक: फ़ाइल अपलोड करें। फॉर्मपैनल का उपयोग करें।
    सर्वर: फ़ाइल की बचत होती है और नए fileId रिटर्न (यदि सफल)

  2. ग्राहक: (onSubmitCompleted से) फ़ाइल के डेटा अपने fileId के साथ एक साथ भेजता है।आपको जो भी डेटा संरचना चाहिए, उसका उपयोग करें
    सर्वर: फ़ाइल जानकारी फ़ील्ड को डीबी में संग्रहीत करता है।

+0

: नए क्षेत्र का क्या अर्थ है। इसे कैसे वापस करें। क्या आप एक छोटा सा उदाहरण दे सकते हैं। – NewCodeLearner

+0

यह मेरे संदेश में "फ़ील्ड" नहीं, नई फ़ाइल आईडी थी – alexp