用JSF下载文件?

哪个是使用JSF下载文件的正确方法?只是放一个文件链接? 在那种情况下,我如何获得文件URL?

我见过一个使用BufferedInputStream的例子:

http://www.winstonprakash.com/articles/jsf/file_download_link.htm

有什么区别?

谢谢

如果它是一个简单的文件,只需放在公共webcontent(放置静态和JSF文件的地方)并创建一个链接。

link 

servletcontainer将担心应用正确的标头。

如果它出于某些特定原因(例如,在服务器机器或数据库中的固定路径中)位于公共webcontent之外,则创建一个servlet,该servlet获取它的InputStream并将其写入响应的OutputStream ,至少Content-TypeContent-DispositionContent-Length标头。 你可以在这里找到一个简单的启动示例。 这也可以简单地链接在servlet的url-pattern

如果它是动态生成的并且取决于JSF特定的请求参数,那么您也可以在受h:commandLinkh:commandButton绑定的托管bean操作中执行此操作,但您只需要确保调用FacesContext#responseComplete()在bean的动作方法结束时阻止JSF手中的导航。 可以重用相同类型的servlet代码来流式传输文件。 您可以在此答案中找到启动示例。

我需要制作类似的代码来通过JSF下载文件

那是我在JSF页面中的下载按钮

  

这是我的Java代码

 public void downloadFile() { File file = new File("/home/marco/file.txt"); HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); response.setHeader("Content-Disposition", "attachment;filename=file.txt"); response.setContentLength((int) file.length()); ServletOutputStream out = null; try { FileInputStream input = new FileInputStream(file); byte[] buffer = new byte[1024]; out = response.getOutputStream(); int i = 0; while ((i = input.read(buffer)) != -1) { out.write(buffer); out.flush(); } FacesContext.getCurrentInstance().getResponseComplete(); } catch (IOException err) { err.printStackTrace(); } finally { try { if (out != null) { out.close(); } } catch (IOException err) { err.printStackTrace(); } } } 

我有一个错误

 FacesContext.getCurrentInstance().getResponseComplete(); 

从类型

 java.lang.IllegalStateException: getOutputStream() has already been called for this response 

我解决了它:

JSF页面:

  

豆法:

 public void downloadFile(File file) { FacesContext facesContext = FacesContext.getCurrentInstance(); HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse(); response.setHeader("Content-Disposition", "attachment;filename=file.txt"); response.setContentLength((int) file.length()); FileInputStream input= null; try { int i= 0; input = new FileInputStream(file); byte[] buffer = new byte[1024]; while ((i = input.read(buffer)) != -1) { response.getOutputStream().write(buffer); response.getOutputStream().flush(); } facesContext.responseComplete(); facesContext.renderResponse(); } catch (IOException e) { e.printStackTrace(); } finally { try { if(input != null) { input.close(); } } catch(IOException e) { e.printStackTrace(); } } }