2010-01-23 17 views
8

का उपयोग कर फ़ाइल डाउनलोड मैं जावा, स्ट्रूट 2 और AJAX का उपयोग कर फ़ाइल डाउनलोड देना चाहता हूं।जावा, स्ट्रूट 2 और AJAX

मेरे एचटीएमएल पेज पर "निर्यात" नामक एक बटन है जिस पर AJAX कॉल किया जाएगा, जो एक क्वेरी निष्पादित करेगा और कोड का उपयोग करके .xls फ़ाइल बनाएगा और मैं उस फाइल को बिना स्टोर किए उपयोगकर्ता को डाउनलोड करने के लिए देना चाहता हूं यह हार्ड ड्राइव पर।

क्या कोई जानता है कि जावा में struts2 और AJAX का उपयोग करके ऐसा कैसे करें?

क्या कोई उदाहरण उपलब्ध है?

अगर तुम मुझे से अधिक जानकारी की आवश्यकता मुझे जानते हैं ...

धन्यवाद।

amar4kintu

उत्तर

11

आप इस मामले में AJAX का उपयोग करने की जरूरत नहीं है। बस अपना बटन फॉर्म को अपने स्ट्रूट एक्शन में सबमिट करें, और कार्रवाई stream result प्रकार का उपयोग करें।

उदाहरण:

अपने Struts एक्सएमएल में:

<result name="download" type="stream"> 
    <param name="contentDisposition">attachment;filename=report.xls</param> 
    <param name="contentType">application/vnd.ms-excel</param> 
    <param name="inputName">inputStream</param> 
    <param name="bufferSize">1024</param> 
</result> 

आपकी कार्रवाई तो एक public InputStream getInputStream() डेटा पास किया जा सके प्रदान करेगा।

मुझे लगता है कि आप जो भी लाइब्रेरी एक्सेल फाइलें उत्पन्न करने के लिए उपयोग कर रहे हैं (POI?) आउटपुट को मनमाने ढंग से OutputStream पर लिख सकते हैं।

एक त्वरित और गंदा तरीका एक InputStream है कि परिवर्तित करने के लिए:

// Using Workbook from Apache POI for example... 
Workbook wb; 
// ... 
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
wb.write(bos); 
InputStream bis = new ByteArrayInputStream(bos.toByteArray()); 
+0

हैलो, मैं अपने struts.xml में follwing रख <कार्रवाई नाम = "ExportReport" विधि = "ExportReport" class = "com.frontend.Interrogations"> \t \t <परिणाम नाम = "सफलता" type = "धारा"> \t \t \t <परम नाम = "contentType"> आवेदन/vnd.ms-एक्सेल \t \t \t \t \t \t <परम नाम = "inputName"> FILESTREAM \t \t \t \t \t \t <परम नाम = "contentDisposition"> लगाव; फ़ाइल नाम = report.xls \t \t \t \t \t \t <परम नाम = "bufferSize"> 1024 \t \t अब मैंने आपके निर्देशों का पालन किया है, लेकिन यह कार्रवाई नाम के साथ डाउनलोड करने के लिए फ़ाइल देता है जो report.xls की बजाय ExportReport.action है तो इसका कारण क्या होना चाहिए? – amar4kintu

+0

तो, आप एमएसआईई का उपयोग कर रहे थे? या तो URL pathinfo के साथ फ़ाइल नाम पास करें, या एक बेहतर वेबब्रोसर का उपयोग करें। – BalusC

+0

मैं फ़ायरफ़ॉक्स का उपयोग कर रहा हूं और इसे मुझे file.xls के रूप में डाउनलोड फ़ाइल देना चाहिए, बल्कि इसके बजाय यह मुझे निर्यात करने के लिए ExportReport.action देता है। और अगर मैं इसे rep.xls पर पुनर्नामित करता हूं। यह सही .xls फ़ाइल दिखाता है जिसे मैं निर्यात कर रहा हूं .. क्या कोई बता सकता है कि मुझे क्या याद आ रही है? – amar4kintu

0

Atlast, मैं निम्नलिखित के रूप में इसे हल करने में सक्षम था .. मैं अपने कार्रवाई वर्ग समारोह में लाइन निम्नलिखित लिखा था और मैं था ExportReport.action के बजाय नाम report.xls के साथ फ़ाइल डाउनलोड करने में सक्षम। मुझे बिल्कुल नहीं पता .. क्यों?

response.setHeader("Content-Disposition","attachment;filename=rpt.xls"); 

मेरे struts.xml फ़ाइल में निम्नलिखित है। मैंने <contentDispositin> से इसे हटा दिया क्योंकि यह struts.xml फ़ाइल से काम नहीं कर रहा था और मैंने इसे अपनी क्रिया जावा फ़ाइल में ऊपर के रूप में रखा है।

<result name="success" type="stream" > 
    <param name="inputName">fileStream</param> 
    <param name="contentType">application/vnd.ms-excel</param> 
    <param name="bufferSize">1024</param> 
</result> 

आशा है कि यह किसी की मदद करेगा।

धन्यवाद।

amar4kintu

0

मैं कार्रवाई वर्ग पर टिप्पणी के इस प्रकार का उपयोग करेंगे: report.xls के बजाय ExportReport.action के रूप में सहेजी गई फ़ाइलों के बारे में amar4kintu के सवाल का एक अनुवर्ती के रूप में

@Result(name = "success", type= StreamResult.class, 
      params = {"contentType", "application/vnd.ms-excel", 
        "contentDisposition", "attachment; filename=report.xls"}, 
      value = "reportFileStream" 
) 
2

, यह IE में होता है यदि आपके स्ट्रैट्स में निम्न प्रारूप का पालन नहीं किया जाता है।xml फ़ाइल:

<result name="download" type="stream"> 
     <param name="contentDisposition">attachment;filename="${flashcardSetBean.title}.xlsx"</param> 
     <param name="contentType">application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</param> 
     <param name="inputName">inputStream</param> 
     <param name="bufferSize">1024</param> 
</result> 

ऐसा लगता है विशेष रूप से contentDisposition लाइन की तरह संकेत देना चाहिए कि फ़ाइल एक लगाव है और वह फ़ाइल नाम उद्धरण से घिरा हुआ है।

2

बस आपके संदर्भ के लिए, हम एक ही का उपयोग कर व्याख्या कर सकते हैं:

public class MyAction { 
    private InputStream fileInputStream; 
    private String logoName; 

    @Action(value="/downloadLogo", 
     results={ 
      @Result(name="success", type="stream", 
      params = { 
        "contentType", "application/image/gif", 
        "inputName", "fileInputStream", 
        "contentDisposition", "filename=\"${logoName}\"", 
        "bufferSize", "1024" 
      }) 
     }   
    )  
    public String downloadLogo() throws Exception { 
     logoName = "test.jpg"; 
      fileInputStream = new FileInputStream(new File("DirePath", logoName)); 
    } 
} 
0

एक InputStream के लिए पाइप outstream को एक बेहतर दृष्टिकोण इस विधि के नीचे as opposed to the response by ZoogieZork above

InputStream is = new PipedInputStream(); 
PipedOutputStream out = new PipedOutputStream((PipedInputStream) is); 
wb.write(out); 

समझाया गया है लाभ यह है कि पूरा बफर स्मृति में संग्रहीत नहीं है बल्कि एक छोटे आंतरिक परिपत्र बफर का उपयोग करके पाइप किया जाता है। यह मेमोरी के साथ ही सीपीयू ओवरहेड दोनों के मामले में बेहतर है।

संदर्भ: Convert a Java OutputStream to an InputStream

संबंधित मुद्दे