Download log file using JSF application?

一曲冷凌霜 提交于 2019-12-11 05:35:56

问题


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.

  1. You would need to implement a simple servlet which generates a zipped log file
  2. Add mapping for this servlet to your web.xml
  3. Add h:outputLink with a link pointing to your new servlet


来源:https://stackoverflow.com/questions/8877794/download-log-file-using-jsf-application

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!