在我由JSF2.0 + Richfaces3.3.3 + Tomcat6.0.29开发的应用程序中。
我将日志文件保存在以下位置: E:\ Tomcat-6.0.29 \ Tomcat6.0 \ logs \ project.log 我的tomcat(webapps)位置: E:\ Tomcat-6.0.29 \ Tomcat 6.0 \ webapps
当我单击该a4j:commandbutton时,我想下载该日志文件,而不更改内容和文件名。
以下代码在(JSF1.2)中工作。但是 在转换JSF2.0之后,以下代码不起作用。
download.jsp
<h:form id="downloadForm" binding="#{Download.initForm}"> <a4j:outputPanel id="downloadOutputPanel"> <a4j:commandButton value="Download Log" action="#{Download.downloadButtonAction}" reRender="downloadOutputPanel"/> </a4j:outputpanel> </h:form>
下载.java
package com.test;
导入java.io.File; 导入javax.faces.component.html.HtmlForm;
import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; public class Download{ private HtmlForm initForm; public String downloadButtonAction() { String fileName = "logs" + File.separator + "project.log"; System.setProperty("download.logfile", "download-logfile") ; downloadLogFile(fileName); return null; } private void downloadLogFile(String fileName) { try { FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext context = facesContext.getExternalContext(); HttpServletResponse response = (HttpServletResponse) context.getResponse(); fileName = fileName.replace(File.separator, "/"); response.sendRedirect("/" + "JSF-Richfaces-3.3.3-Demo-2" + /faces/fileDownloadServlet/" + fileName); } catch (Exception ex) { System.out.println("Exception occours while downloading templates: "+ ex); } } public HtmlForm getInitForm(){ return initForm; } public void setInitForm(HtmlForm initForm){ this.initForm = initForm; } }
还有我的 FileDownloadServlet.java 类
package com.test; import javax.servlet.ServletException; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.Closeable; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URLDecoder; import javax.servlet.ServletConfig; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FileDownloadServlet extends HttpServlet { ServletConfig servletConfig; @Override public void init(ServletConfig servletConfig) { this.servletConfig = servletConfig; } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { String contentType = null; String filePath = ""; String fileName = ""; String requestURI = request.getRequestURI(); try { fileName = requestURI.substring(requestURI.lastIndexOf('/') + 1); String catalinaHome = "." + File.separator + ".." + File.separator; if (System.getProperty("os.name").contains("Windows")) { catalinaHome = ""; } filePath = catalinaHome + requestURI.substring(requestURI.indexOf(System.getProperty("download.logfile")), requestURI.lastIndexOf("/")); filePath = filePath.replace("/", File.separator); } catch (Exception exception) { System.out.println("Exception occurred while parsing the request URI : " + exception); } finally { System.out.println("File path after parsing in download servlet : " + filePath); } filePath = filePath + File.separator + fileName; fileName = URLDecoder.decode(fileName, "UTF-8"); File file = new File(filePath); try { contentType = request.getSession().getServletContext().getMimeType(fileName); } catch (Exception exception) { System.out.println("Exception while getting content type : ", exception); } if (contentType == null) { contentType = "application/octet-stream"; } BufferedInputStream input = null; BufferedOutputStream output = null; try { input = new BufferedInputStream(new FileInputStream(file)); int contentLength = input.available(); response.reset(); response.setContentType(contentType); response.setContentLength(contentLength); response.setHeader("Content-disposition", "attachment; filename=\"" + fileName + "\""); output = new BufferedOutputStream(response.getOutputStream()); for (int data; (data = input.read()) != -1;) { output.write(data); } output.flush(); } catch (Exception e) { System.out.println("Exception in File Download : " + e); } finally { close(output); close(input); } } private static void close(Closeable resource) { if (resource != null) { try { resource.close(); } catch (IOException e) { System.out.println("Error ", e); } } } }
web.xml
... ... <servlet> <servlet-name>fileDownloadServlet</servlet-name> <servlet-class>com.test.FileDownloadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>fileDownloadServlet</servlet-name> <url-pattern>/fileDownloadServlet/*</url-pattern> </servlet-mapping> ... ...
错误是:
HTTP Status 404 - /fileDownloadServlet/logs/project.log not found type Status report message /fileDownloadServlet/logs/project.log not found description The requested resource (/fileDownloadServlet/logs/project.log not found) ` is not available.` Apache Tomcat/6.0.29
同时,我的地址栏显示此URL http:// localhost:8080 / JSF-Richfaces-3.3.3-Demo-2 / faces / fileDownloadServlet / logs / project.log
帮帮我..预先感谢。
我宁愿建议使用另一个servlet进行压缩并指向它h:outputLink。即使您确实设法以某种方式通过FacesServlet推送文件,它也可能无法移植或可能导致一些意外问题。
h:outputLink