DownloadLink
là đẹp và tiện dụng cho việc tạo ra một nút/link để tải về một tập tin, cùng những dòng này:Làm thế nào để sử dụng DownloadLink của Wicket với một tập tin được tạo ra khi đang bay?
add(new DownloadLink("downloadButton", getReportFile(), "report.pdf"));
và
<input type="button" wicket:id="downloadButton" value="Download" />
Tuy nhiên, tôi muốn kích hoạt việc tạo ra các tập tin để tải xuống chỉ khi nút/liên kết được nhấp vào. Nói cách khác, khi nhấp vào, tôi sẽ gọi một phương thức tạo tệp (báo cáo Pentaho trong trường hợp của chúng tôi), đặt nó ở vị trí tạm thời và trả về một dấu phẩy File
trỏ đến nó. Sau đó, tôi sẽ yêu cầu DownloadLink
sử dụng số File
đó. Câu hỏi là, là điều này có thể bằng cách nào đó?
Hiện tại chúng tôi có một cái gì đó giống như mã bên dưới, hoạt động, nhưng tôi quan tâm đến việc liệu DownloadLink
có thể được sử dụng thay thế hay không.
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"));
}
});
(Wicket v1.4.18, nếu nó làm cho một sự khác biệt.)
Bạn cũng có thể ghi đè lên onClick của DownloadLink và thực hiện 'setModelObject()' trước khi gọi phương thức siêu. Tuy nhiên, gợi ý của Xavi là sạch hơn nhiều. – jbrookover
1. Sử dụng 'LoadableDetachableModel' để thay thế. 'getObject()' có thể được gọi nhiều lần trong một yêu cầu, nhưng 'load()' sẽ không; 2. Nếu tệp luôn được tạo lại, bạn có thể gọi 'downloadLink.setDeleteAfterDownload (true)', vì vậy bạn không phải lo lắng về việc xóa tệp tạm thời sau đó. – tetsuo
@tetsuo Cảm ơn những nhận xét quý giá của bạn. Tôi đã cập nhật câu trả lời với các đề xuất của bạn. –