GWT

2010-05-12 13 views
9

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

इस फ़ाइल में ग्राहक को वापस स्ट्रीम करने के लिए अपने परीक्षण कोड है, लेकिन किसी कारण से मुझे लगता है कि ग्राहक के लिए फ़ाइल स्ट्रीम करने के लिए कैसे जब मैं आरपीसी उपयोग कर रहा हूँ पता नहीं है:

public class ReportsServiceImpl extends RemoteServiceServlet implements ReportsService { 
    public String myMethod(String s) { 

     File f = new File("/excelTestFile.xls"); 

     String filename = f.getName(); 

     int length = 0; 

     try { 
      HttpServletResponse resp = getThreadLocalResponse(); 
      ServletOutputStream op = resp.getOutputStream(); 
      ServletContext context = getServletConfig().getServletContext(); 
      resp.setContentType("application/octet-stream"); 
      resp.setContentLength((int) f.length()); 
      resp.setHeader("Content-Disposition", "attachment; filename*=\"utf-8''" + filename + ""); 

      byte[] bbuf = new byte[1024]; 
      DataInputStream in = new DataInputStream(new FileInputStream(f)); 

      while ((in != null) && ((length = in.read(bbuf)) != -1)) { 
       op.write(bbuf, 0, length); 
      } 

      in.close(); 
      op.flush(); 
      op.close(); 

     } 
     catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

     return "Server says: " + filename; 
    } 
} 

मैंने इंटरनेट पर कहीं भी पढ़ा है कि आप आरपीसी के साथ फाइल स्ट्रीम नहीं कर सकते हैं और मुझे इसके लिए सर्वलेट का उपयोग करना होगा। क्या Servlet का उपयोग करने के तरीके और से उस सर्वलेट को कॉल करने का कोई उदाहरण है ReportsServiceImpl। क्या मुझे वास्तव में एक सर्वलेट बनाने की आवश्यकता है या इसे मेरे आरपीसी के साथ वापस स्ट्रीम करना संभव है?

+0

अधिक विस्तार से समस्या कृपया विस्तार से बताएं। "यह नहीं जानता" वास्तव में वर्णनात्मक नहीं है। वास्तव में क्या होता है? वास्तव में क्या नहीं होता है? – BalusC

+1

@sri का उत्तर समझ में आता है। अब कुछ टिप्पणियां पोस्ट करने की मेरी बारी है: 1) 'डेटा इनपुट स्ट्रीम' अतिप्रवाह है। बस सीधे 'FileInputStream' का उपयोग करें। आप सभी * केवल * के बाद 'इनपुटस्ट्रीम' वर्ग में निर्धारित 'read()' विधि की आवश्यकता है। 2) 'इन! = नल' चेक अतिप्रवाह है क्योंकि यह ** कभी ** शून्य नहीं है (आपने 'नया' का उपयोग करके नया बनाया है, जो कभी शून्य नहीं हो सकता है)। 3) 'सामग्री-विस्थापन' शीर्षलेख 'फ़ाइल नाम' भाग में विकृत दिखता है। कुछ विचारों को प्राप्त करने के लिए * मूल * फ़ाइल सेवा कैसे करें, आपको [यह आलेख] (http://balusc.blogspot.com/2007/07/fileservlet.html) उपयोगी हो सकता है। सौभाग्य। – BalusC

उत्तर

14

आपको नियमित रूप से सर्वलेट बनाना है, ReportsServiceImpl से स्ट्रीम बाइनरी डेटा नहीं कर सकता है। साथ ही, ReportsServiceImpl से सर्वलेट को कॉल करने का कोई तरीका नहीं है - आपके क्लाइंट कोड को सीधे सर्वलेट का आह्वान करना होगा।

क्लाइंट साइड पर, आपको क्वेरी स्ट्रिंग के माध्यम से पारित पैरामीटर के साथ एक सामान्य एंकर लिंक बनाना होगा। की तरह कुछ।

सर्वर की तरफ, अपना कोड मानक सर्वलेट पर ले जाएं, जो RemoteServiceServlet से प्राप्त नहीं होता है। अनुरोध ऑब्जेक्ट से पैरामीटर पढ़ें, एक्सेल बनाएं और उसे क्लाइंट को वापस भेजें। ब्राउज़र स्वचालित रूप से फ़ाइल डाउनलोड संवाद बॉक्स पॉपअप करेगा।

+1

हाँ, यह समझ में आता है। तुम्हारे सुझाव के लिए धन्यवाद! – Maksim

0

उदाहरण के लिए, आरपीसी चैनल के माध्यम से आप जिस बाइनरी डेटा को वापस चाहते हैं उसे प्राप्त करना संभव है ... uuencode। हालांकि, आपको अभी भी फ़ाइल को डाउनलोड के रूप में फ़ाइल को संभालने के लिए प्राप्त करना होगा।

और, आपके कोड के आधार पर, ऐसा लगता है कि आप सर्वर में प्रतिक्रिया संशोधित करके दिए गए माइम-प्रकार को संभालने के लिए मानक ब्राउज़र तंत्र को ट्रिगर करने का प्रयास कर रहे हैं ताकि ब्राउजर इसे डाउनलोड के रूप में पहचान सके ... खुला उदाहरण के लिए, एक सेव संवाद। ऐसा करने के लिए, आपको ब्राउज़र को आपके लिए अनुरोध करने की आवश्यकता है और आपको अनुरोध को संभालने के लिए वहां सर्वलेट की आवश्यकता है। यह बाकी यूआरएल के साथ किया जा सकता है, लेकिन आखिरकार आपको ऐसा करने के लिए एक सर्विट की आवश्यकता होगी।

आपको संशोधित प्रतिक्रिया ऑब्जेक्ट को वापस भेजने वाले यूआरएल पर एक ब्राउज़र विंडो यूआरएल सेट करने की ज़रूरत है।

तो यह प्रश्न (स्ट्रीमिंग के बारे में) कोड नमूना के साथ वास्तव में संगत नहीं है। एक या दूसरे (संचार प्रोटोकॉल या सर्वर-संशोधित प्रतिक्रिया ऑब्जेक्ट) दृष्टिकोण को समायोजित किया जाना है।

समायोजन करने का सबसे आसान तरीका संचार विधि है।

+0

ओह क्षमा करें तारीख – Rondo

2

आपको लगता है कि बस का उपयोग कर GWT RPC और Data URIs कर सकते हैं:

  1. अपने उदाहरण में, अपने myMethod फ़ाइल लौट सामग्री बनाते हैं।
  2. ग्राहक पक्ष पर, फ़ाइल सामग्री प्राप्त के साथ Data URI प्रारूपित करें।
  3. स्वरूपित DataURI उत्तीर्ण फ़ाइल सहेजें संवाद खोलने के लिए Window.open का उपयोग करें।

इस संदर्भ पर एक नजर डालें, Data URI उपयोग को समझने के लिए:

Export to csv in jQuery

+1

को ध्यान में रखना चाहिए कि डेटा यूआरआई आईई 6 और 7 पर समर्थित नहीं हैं। आईई 8 में आंशिक समर्थन है। – codingscientist