1、首先,附上页面的代码,只需要加个按钮触发事件就行了,但是必须要加多个参数ajax=“false”,不然点击下载就一直在旋转:
<p:commandLink value="下载" ajax="false" actionListener="#{projectAttach.downloadFile(id)}">
2、java代码实现的话就直接在ProjectAttach里加一个downloadFile方法即可,具体代码如下:
public void downloadFile(String id) throws IOException{
ProjectAttachaPo aPo = projectAttachaPoService.find(accId);
String fileName = aPo.getFilename();
String path = aPo.getFilePath();
ServletOutputStream out = null;
InputStream is = null;
try {
FacesContext ctx = FacesContext.getCurrentInstance();
ctx.responseComplete();
String contentType = "application/x-download";
HttpServletResponse response = (HttpServletResponse) ctx
.getExternalContext().getResponse();
response.setContentType(contentType);
StringBuffer contentDisposition = new StringBuffer();
contentDisposition.append("attachment;");
contentDisposition.append("filename=\"");
contentDisposition.append(fileName);
contentDisposition.append("\"");
response.setHeader(
"Content-Disposition",
new String(contentDisposition.toString().getBytes(
System.getProperty("file.encoding")), "iso8859_1"));
out = response.getOutputStream();
byte[] bytes = new byte[0xffff];
is = new FileInputStream(new File(path));
int b = 0;
while ((b = is.read(bytes, 0, 0xffff)) > 0) {
out.write(bytes, 0, b);
}
out.flush();
ctx.responseComplete();
} catch (Exception e) {
if(is!=null){
is.close();
}
if(out!=null){
out.close();
}
e.printStackTrace();
}finally{
if(is!=null){
is.close();
}
if(out!=null){
out.close();
}
}
}
3、其中上面需要注意的下面的代码,需要使用下面的代码来获取response对象,不能使用this.getResponse()来获取,否则在后面使用response.getOutputStream()获取输出流的时候会报个错误:getOutputStream() has already been called for this response
FacesContext ctx = FacesContext.getCurrentInstance();
ctx.responseComplete();
String contentType = "application/x-download";
HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse();
4、这样就可以实现JSF下载功能了,以上内容仅供学习参考,谢谢!