2012-08-02 31 views
8

द्वारा जेनरेट की गई फ़ाइल डाउनलोड करें मेरे पास मेरा निर्यात सर्लेट है, जो एक्सएलएसएक्स फाइलें (एक्सेल) उत्पन्न कर रहा है जो मेरा उपयोगकर्ता निर्यात बटन पर क्लिक करके मेरे जीडब्ल्यूटी एप्लिकेशन से अनुरोध करेगा।पोस्ट डेटा के साथ जीडब्ल्यूटी से कॉल सर्वलेट और सर्वलेट

यदि मैं जीईटी दृष्टिकोण का उपयोग करता हूं, तो उपयोगकर्ता को फ़ाइल डाउनलोड करने के लिए कहा जाता है। कोड इस तरह दिखता है:

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException 
{ 
    try 
    { 
     byte[] xlsx = createTest(""); 
     sendXLSX(resp, xlsx, "test.xlsx"); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

void sendXLSX(HttpServletResponse response, byte[] bytes, String name) 
     throws IOException 
{ 
    ServletOutputStream stream = null; 

    stream = response.getOutputStream(); 
    response.setContentType(CONTENT_TYPE_XLSX); 
    response.addHeader("Content-Type", CONTENT_TYPE_XLSX); 
    response.addHeader("Content-Disposition", "inline; filename=" + name); 
    response.setContentLength((int) bytes.length); 
    stream.write(bytes); 
    stream.close(); 
} 

यह निम्नलिखित तरीके से GWT ग्राहक द्वारा लाया जाता है:

String url = GWT.getModuleBaseURL() + "ExportServlet"; 
Window.open(url, "", ""); 

और उपयोगकर्ता फ़ाइल डाउनलोड करने के लिए कहा जाता है। अच्छा, जो मैं चाहता हूं :)

लेकिन मैं अनुरोध में बहुत से डेटा संलग्न करना चाहता हूं, और इसके अलावा, यूआरएल पैरामीटर में आप कितना डेटा डाल सकते हैं ("ExportServlet? Data = ... "), इसलिए मैं इसके बजाय एक POST अनुरोध में लपेटना चाहता हूं।

String url = GWT.getModuleBaseURL() + "ExportServlet"; 
RequestBuilder builder = new RequestBuilder(
          RequestBuilder.POST, url); 
Request response = builder.sendRequest("test data", new RequestCallback() 
{ 
    @Override 
    public void onResponseReceived(Request request, Response response) 
    { 
     System.out.println(""); 
    } 

    @Override 
    public void onError(Request request, Throwable exception) 
    { 
     System.out.println(""); 
    } 
}); 

और यह मेरा सर्वलेट में:

@Override 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException 
{ 
    try 
    { 
     String data = req.getReader().readLine(); 
     byte[] xlsx = createTest(data); 
     sendXLSX(resp, xlsx, "test.xlsx"); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

लेकिन उपयोगकर्ता फ़ाइल डाउनलोड करने का संकेत नहीं है

मैं GWT से निम्नलिखित की कोशिश की है। डूपोस्ट विधि का आह्वान किया जाता है और डेटा सर्वलेट द्वारा प्राप्त होता है, लेकिन क्या मुझे XWSX फ़ाइल को जीडब्ल्यूटी ऐप में प्राप्त प्रतिक्रिया से निकालना है? और मुझे ऐसा करने का क्या लगता है?

कोई मदद या टिप्पणी :)

+2

फोन मैं इस पोस्ट पाया: http://stackoverflow.com/questions/7282987/handle-attachment-in-response-with-requestbuilder-in-gwt जो मेरे प्रश्न का उत्तर दे सकता है। मैं इसे आज़माउंगा और आपको लोगों को बता दूंगा :) (इस एसओ प्रश्न के साथ लिंक को लिंक/लिंक करने के बारे में नहीं पता) –

+1

आपने अभी यह किया है :) –

उत्तर

7

ठीक है की सराहना, तो मैं जुड़ा हुआ तो सवाल में 3 दृष्टिकोण के साथ चला गया।

एक फॉर्मपैनल बनाएं, अपना डेटा छिपे हुए फ़ील्ड में रखें, यूआरएल को अपने सर्वलेट पर सेट करें, फॉर्म पर प्रोग्रामेटिक रूप से सबमिट विधि को कॉल करें और इस SO प्रश्न में वर्णित समस्या हल हो जाएगी। छिपा क्षेत्रों से डेटा निकालने के लिए कैसे पर

विवरण:

तो मेरी doPost समान यह करने के लिए लग रहा है:

@Override 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) { 
    ServletFileUpload upload = new ServletFileUpload(); 
    FileItemIterator iterator = upload.getItemIterator(req); 

    while (iterator.hasNext()) { 
     FileItemStream item = iterator.next(); 
     if (item.isFormField()) { 
      String name = item.getFieldName(); 
      if (name.equalsIgnoreCase("fieldName")) { 
       data = Streams.asString(item.openStream(), ENCODING_UTF8); 
      } 
     } 
    } 
    ... 

मैं नाम "FIELDNAME" के साथ अपने रूप में एक छिपी हुई फ़ील्ड है , जहां डेटा डाल दिया जाता है और सर्वलेट में जमा किया जाता है। आशा है कि इस मदद करता है :)

+1

यदि आप कर सकते हैं तो कृपया विवरण साझा करें। –

+0

मेरे उत्तर में और विवरण जोड़ा गया –

1

हाय मैं बिल्कुल वैसा ही उतरते हैं, directlly का उपयोग करके इसे हल सर्वलेट का उपयोग कर Window.Location.replace(URL.encode(servletUrl));

जांच के लिए इस लिंक के साथ-साथ related Issue