一尘不染

使用JSF应用程序下载日志文件?

tomcat

在我由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

帮帮我..预先感谢。


阅读 256

收藏
2020-06-16

共1个答案

一尘不染

我宁愿建议使用另一个servlet进行压缩并指向它h:outputLink。即使您确实设法以某种方式通过FacesServlet推送文件,它也可能无法移植或可能导致一些意外问题。

  1. 您将需要实现一个简单的servlet,该servlet会生成一个压缩日志文件
  2. 将此Servlet的映射添加到您的web.xml
  3. 添加h:outputLink带有指向新servlet 的链接
2020-06-16