【发布时间】:2020-04-26 13:28:23
【问题描述】:
我想按行点击 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;
}
是否可以通过单击数据表行来下载文件?
【问题讨论】:
-
方法
actionDownload()被调用了吗? -
@Selaron:据我所知不是。值得注意的是,OP 认为它与下载有关,而不是试图在其中放一个
system.out.println -
@Selaron:是的,方法 actionDownload() 被调用并执行。但是什么也没发生。我通过从 commandButton 调用测试了 actionDownload() 方法,一切正常。但是通过 Ajax 调用并不会带来相同的结果。
-
看到你缩小了问题的范围。我认为会有重复(因此我还没有回答并希望你缩小问题范围)如果@BalusC 回答没有必要尝试找到重复,因为有 99,999% 的确定性不是
标签: jsf primefaces datatable download