[英]Downloading file during p:ajax rowSelect event in p:dataTable
我想通過單擊 primefaces 數據表逐行下載文檔文件。 我嘗試使用這樣的 ajax 從 Bean 調用操作:
<p:dataTable
id="docId"
value="#{testBean.document}"
var="doc"
selectionMode="single"
selection="#{testBean.selectedDoc}"
>
<p:ajax event="rowSelect" listener="#{testBean.actionDownload}"/>
<p:column>
...
</p:column>
...
</p:dataTable>
但是下面的代碼沒有執行我想要的。 我的行動邏輯是正確的。 但似乎下載文件不適用於ajax請求。 沒有反應,下載不執行。
public String actionDownload() {
try {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
StringBuffer contentDisposition = new StringBuffer();
contentDisposition.append("attachment;");
contentDisposition.append("filename=\"");
contentDisposition.append(name);
contentDisposition.append("\"");
response.reset();
response.setContentType("application/x-download");
response.setHeader("Content-Disposition", contentDisposition.toString());
ServletOutputStream out = response.getOutputStream();
response.setContentType("application/x-download");
out.write(output);
out.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
FacesContext.getCurrentInstance().responseComplete();
return null;
}
是否有另一種方法可以通過單擊數據表行來下載文件?
您無法使用 JSF/PrimeFaces Ajax 下載文件。 改為將其設為非 Ajax 請求。
將<p:ajax>
的 ajax 偵聽器替換為oncomplete
的 GET 請求,例如:
<p:ajax event="rowSelect" oncomplete="window.location='#{request.contextPath}/download/#{doc.id}'"/>
並將支持 bean 方法actionDownload()
替換為一個普通的 vanilla Servlet,例如:
@WebServlet("/download/*")
public class Download extends HttpServlet {
@Inject
private DocumentService service;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Document document = service.find(Long.valueOf(request.getPathInfo().substring(1)));
response.setContentType(getServletContext().getMimeType(document.getFileName()));
response.setContentLength(document.getContent().length);
response.setHeader("Content-Disposition", "attachment;filename=\"" + URLEncoder.encode(document.getFileName(), "UTF-8") + "\"");
response.getOutputStream().write(document.getContent());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.