问题
In my application developed by JSF2.0 + Richfaces3.3.3 + Tomcat6.0.29.
I maintain my log file into this location : E:\Tomcat-6.0.29\Tomcat6.0\logs\project.log
My tomcat(webapps) Location : E:\Tomcat-6.0.29\Tomcat 6.0\webapps
When i click that a4j:commandbutton i want to download that log file, without change the content and filename.
The following code worked in (JSF1.2). But
After convert JSF2.0, the following code doesn't work.
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>
Download.java
package com.test;
import java.io.File; import 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;
}
}
And my FileDownloadServlet.java class
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>
...
...
Error is :
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
At the same time my address bar show this url http://localhost:8080/JSF-Richfaces-3.3.3-Demo-2/faces/fileDownloadServlet/logs/project.log
Help me.. Thanks in advance.
回答1:
I would rather recommend using another servlet to do the zipping and point to it with h:outputLink
instead. Even if you do manage to somehow push the file through the FacesServlet it may not be portable or may cause some unexpected problems.
- You would need to implement a simple servlet which generates a zipped log file
- Add mapping for this servlet to your web.xml
- Add
h:outputLink
with a link pointing to your new servlet
来源:https://stackoverflow.com/questions/8877794/download-log-file-using-jsf-application