DownloadLink
, अच्छा और एक फाइल डाउनलोड करने के लिए एक बटन/लिंक बनाने के लिए उपयोगी है इन पंक्तियों के साथ:फ्लाई पर जेनरेट की गई फ़ाइल के साथ विकेट के डाउनलोड लिंक का उपयोग कैसे करें?
add(new DownloadLink("downloadButton", getReportFile(), "report.pdf"));
और
<input type="button" wicket:id="downloadButton" value="Download" />
हालांकि
, मैं करने के लिए ट्रिगर फ़ाइल की पीढ़ी चाहते हैं केवल तभी डाउनलोड करें जब बटन/लिंक पर क्लिक किया जाता है। दूसरे शब्दों में, क्लिक करने पर, मैं एक विधि को कॉल करता हूं जो फ़ाइल (हमारे मामले में एक पेंटाहो रिपोर्ट) उत्पन्न करता है, इसे एक अस्थायी जगह में रखता है और File
को इंगित करता है। तो मैं उस File
का उपयोग करने के लिए DownloadLink
बता दूंगा। प्रश्न है, क्या यह संभव है?
वर्तमान में हमारे पास नीचे दिए गए कोड की तरह कुछ है, जो काम करता है, लेकिन मुझे इसमें दिलचस्पी है कि DownloadLink
इसके बजाय उपयोग किया जा सकता है या नहीं।
add(new Link<Void>("downloadButton") {
@Override
public void onClick() {
IResourceStream resourceStream = new AbstractResourceStreamWriter() {
@Override
public void write(OutputStream output) {
try {
reportService.generateReport(output, report);
} catch (IOException e) {
// ...
}
}
@Override
public String getContentType() {
return CONTENT_TYPE_PDF;
}
};
getRequestCycle()
.setRequestTarget(new ResourceStreamRequestTarget(resourceStream)
.setFileName("report.pdf"));
}
});
(विकेट 1.4.18, अगर यह एक फर्क नहीं पड़ता।)
आप डाउनलोड लिंक पर क्लिक ओवरराइड भी कर सकते हैं और सुपर विधि को कॉल करने से पहले 'setModelObject()' कर सकते हैं। हालांकि, ज़वी का सुझाव बहुत साफ है। – jbrookover
1. इसके बजाय 'लोड करने योग्यडेटाबल मॉडल' का उपयोग करें। अनुरोध के दौरान getObject() 'को कई बार बुलाया जा सकता है, लेकिन 'लोड()' नहीं होगा; 2. अगर फ़ाइल हमेशा जेनरेट की जाती है, तो आप 'downloadLink.setDeleteAfterDownload (true)' कॉल कर सकते हैं, इसलिए आपको बाद में temp फ़ाइल को हटाने के बारे में चिंता करने की आवश्यकता नहीं है। – tetsuo
@tetsuo आपकी बहुमूल्य टिप्पणियों के लिए धन्यवाद। मैंने आपकी सिफारिशों के साथ उत्तर अपडेट किया है। –