Java 在JSF中下载带有IOUtils的zip文件时出错,错误为;空响应,从服务器接收到空响应;

Java 在JSF中下载带有IOUtils的zip文件时出错,错误为;空响应,从服务器接收到空响应;,java,jsf,io,download,zip,Java,Jsf,Io,Download,Zip,我正在JSFbean中使用Java从web服务器下载zip文件。我的代码适用于JPEG,但不适用于ZIP。这是我的密码 private void createDownloadFile(final URL downloadUrl, final String mimeType) { final FacesContext fc = FacesContext.getCurrentInstance(); final ExternalContext context = fc.getExter

我正在JSFbean中使用Java从web服务器下载zip文件。我的代码适用于JPEG,但不适用于ZIP。这是我的密码

private void createDownloadFile(final URL downloadUrl, final String mimeType) {
    final FacesContext fc = FacesContext.getCurrentInstance();
    final ExternalContext context = fc.getExternalContext();
    final HttpServletResponse response = (HttpServletResponse) context.getResponse();
    response.setContentType(mimeType);
    response.addHeader("Content-Disposition", "attachment; filename=\"" + downloadUrl + "\"");

    try{
        final OutputStream out = response.getOutputStream();
        IOUtils.copy(downloadUrl.openStream(), out);
        fc.responseComplete();
    }catch (final IOException exc){
      exc.printStackTrace();
    }

}
这就是错误:空响应,从服务器接收到空响应。感谢您的帮助

空响应,从服务器接收到空响应

在Chrome中,此消息可识别为XML解析错误;XML解析器找不到请求的XML根元素。结合您尝试执行的任何操作,这表明您试图通过JavaScript/Ajax下载该文件。无法执行此操作,因为由于明显的安全原因,JavaScript没有强制使用保存在变量中的文件内容的另存为对话框的工具

导致此错误消息的原因是JSF ajax响应被定义为返回特定的XML格式,
,等等。但如果JSF ajax响应中缺少
根元素,则特定于浏览器的XML解析器将/可能显示此类错误

您需要通过同步请求来下载该文件。删除
或将第三方组件的任何ajax切换属性设置为
false
,例如

您不必担心浏览器中的页面更改,因为您已经设置了
Content-Disposition:attachment
response标题,当前页面将保持不变。顺便说一句,这个问题并不是Commons IO特有的

另见:

您是否尝试使用常规web浏览器下载该文件?将完全相同的URL放入浏览器,然后重试。你看到了什么?是的,我看到了。我在我的网络浏览器中复制了URL。我看到了下载窗口这是你的发送代码。您的接收代码是什么样子的?我在另一种方法中变成了从webservicefinal URL downloadUrl=service.download(myList)到zip文件的URL;如果(downloadUrl!=null){createDownloadFile(downloadUrl,“application/zip”);}感谢您的回答。我会检查并尝试它的工作,这是我的问题。我有f:ajax和h:commandLink供下载。