JSF 文件下载
程序员文章站
2022-03-09 16:36:37
...
<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; }