JSF 文件下载
程序员文章站
2024-03-13 16:21:57
...
<h:commandLink actionListener="#{referenceGuideCtrller.download}" value="Download" > <f:param name="fileLink" value="#{refFile.filePath}"></f:param> </h:commandLink>
public void download() {
try {
FacesContext fc = FacesContext.getCurrentInstance();
String fileName = FacesContextUtil.getRequest().getParameter("fileLink");
String filePath = FacesContextUtil.getFileUploadPath() + fileName;
logger.debug("file path:" + filePath); //filePath:/mnt/vishuo-data/reference/test.txt
ByteArrayOutputStream baos= downloadFile(filePath);
HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse();
response.reset();
response.setHeader("Content-disposition", "attachment; filename=" + fileName.substring(fileName.lastIndexOf("/")+1)); //不是内嵌显示(attachment),而是作为附件下载
// response.setHeader("Content-disposition", "inline; filename=" + fileName.substring(fileName.lastIndexOf("/")+1)); //内嵌显示(inline)
response.setContentType("application/x-download");
response.setContentLength(baos.size());
ServletOutputStream sos = response.getOutputStream();
baos.writeTo(sos);
baos.close();
sos.flush();
sos.close();
FacesContext.getCurrentInstance().responseComplete();
} catch (IOException ex) {
logger.debug(ex);
}
}
public ByteArrayOutputStream downloadFile(String fileName) throws IOException {
FileInputStream fis=new FileInputStream(fileName);
BufferedInputStream bis=new BufferedInputStream(fis);
ByteArrayOutputStream baos=new ByteArrayOutputStream();
BufferedOutputStream bos=new BufferedOutputStream(baos);
int i;
while((i=bis.read())!=-1) {
bos.write(i);
}
bos.flush();
bis.close();
return baos;
}