如何在JSF中下载* .txt或* .log文件

时间:2012-01-16 11:19:19

标签: jsf download text-files

我想在JSF中下载保存在硬盘中的 .txt / .log文件,我没有收到任何错误,但问题是无法下载文件,需要一些帮助..

注意:我首先尝试压缩文件,然后下载。

我试过了:

response.setContentType("text/html");
response.setContentType("text/plain");

page.xhtml中的代码:

 <h:form>     
<a4j:outputPanel id="downloadPanel">
                   <table><tr>
                    <td>
                        <h:commandButton id="dldFiles" title="Download File" image="/images/download.png"  
                                            style="width:20px; height:20px;"/>
                    </td>
                    <td>
                        <h:outputText value="Download log file" style="font-size: 11px; color:#56ADF8; font-weight: bold; cursor:pointer;"/>
                   </td>
                    </tr></table>
                    <a4j:support event="onclick" action="#{sqlLoaderAction.downloadFile}" reRender="uploadForm"></a4j:support>
                </a4j:outputPanel>

            </rich:panel> 
</h:form>

在肌动蛋白豆方法中:

public String downloadFile(){
        System.out.println("--inside exportGoogleFeed--");
        FacesContext fc = FacesContext.getCurrentInstance();
        try{

            User user = getUserBean();
            Object sp = getServiceProxy(user);


            HttpServletResponse response = ((HttpServletResponse)fc.getExternalContext().getResponse());
            fc.responseComplete();
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition","attachment;filename=downloadname.zip");

            OutputStream  respOs = response.getOutputStream();

            String dldFileName = "SQLLDR_28.txt";
            PrintWriter pw1 = new PrintWriter(new FileWriter(dldFileName , false));

            BufferedReader readbuffer = new BufferedReader(new FileReader("D:/Sqlldr_Container/downloadFile.txt"));
            String strRead;
               while((strRead=readbuffer.readLine())!=null){
                    pw1.println(strRead);
               }
            pw1.close();
            File fil = new File(dldFileName);
            ZipUploadStatusFile(dldFileName, respOs); 
            boolean bool = fil.delete();
            System.out.println("-------Temp file Created deleted - "+bool+" ------------");
            readbuffer.close();

        }
        catch (UnAuthenticatedException e) {
            e.printStackTrace();
        } /*catch (UnAuthorizedAccessException e) {
            e.printStackTrace();
        }*/ catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }


    public static void ZipUploadStatusFile(String fileName, OutputStream respOs){
        try{
            ZipOutputStream out = new ZipOutputStream(respOs);
            byte[] data = new byte[1000]; 
            BufferedInputStream in = new BufferedInputStream
            (new FileInputStream(fileName));
            int count;
            out.putNextEntry(new ZipEntry(fileName));
            while((count = in.read(data,0,1000)) != -1){  
                out.write(data, 0, count);
            }
            in.close();
            out.flush();
            out.close();
            System.out.println("Your file is zipped");  
        }catch(Exception e){
            e.printStackTrace();
        } 
    }

执行上述方法后,屏幕下方: enter image description here

谢谢.....

3 个答案:

答案 0 :(得分:2)

您无法通过ajax下载文件。由于安全原因,JavaScript无法强制执行另存为对话。在您的特定情况下,它可以做的最好的事情是显示响应内联。

通过将<a4j:support>方法直接放在action中,摆脱<h:commandButton>并使其成为一个完整的同步请求。

答案 1 :(得分:0)

这是满足将文本文件下载到客户端系统的代码。

 public String downloadFileText() {
    File file = new File(GlobalPath);
    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();  
        }  
    }  
    return null;
}

答案 2 :(得分:-2)

我不认为代码运行正常,因为代码在JSF MAnaged bean中并且它在服务器端运行,因此文件将在运行应用程序服务器的系统下载,现在您需要做的是检查,使用两个, 在一台电脑上部署网络并尝试从其他电脑上下载文件,然后检查代码的行为,如果文件可以在客户端电脑中下载那么这很好,其他方面你需要找到替代品