1

我正在使用 JSF,并且在其中一个托管 bean(视图范围)中,我有一个方法:

public String viewReport() {

        HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();

        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition","attachment;filename=book1.xls");

        try {
            File file = new File("C:\\soheb\\book1.xls");
            FileInputStream fileIn = new FileInputStream(file);
            ServletOutputStream out = response.getOutputStream();

            byte[] outputByte = new byte[4096];
            //copy binary contect to output stream
            while(fileIn.read(outputByte, 0, 4096) != -1)
            {
                out.write(outputByte, 0, 4096);
            }
            fileIn.close();
            out.flush();
            out.close();
        }
        catch(IOException e) {
            e.printStackTrace();
        }
        return null;
}

正在检索的 excel 文件已损坏。上面有一些奇怪的字符,下面是整个JSP代码。我什至也尝试了 contenttype 的 application/octet-stream。

我对纯文本文件进行了同样的尝试,并且能够通过它打开它。

请帮我解决这个问题,在此先感谢。

4

1 回答 1

1

上面有一些奇怪的字符

您需要事先重置响应。

response.reset();

另一个可能的原因是正在保存的文件本身已损坏。例如,使用 aWriter而不是OutputStream.


以下是JSP的完整代码

您需要告诉 JSF 您已经自己完成了响应,这样它就不会在调用 action 方法后执行其默认导航和呈现响应作业。

context.responseComplete();

也可以看看:

于 2013-04-17T13:46:52.003 回答