3

我正在使用我的 jsf bean 中的 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();
    }

}

这就是错误:空响应,从服务器收到空响应。任何帮助表示赞赏。

4

1 回答 1

1

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

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

此错误消息是因为 JSF ajax 响应被定义为返回特定的 XML 格式<partial-response><update>等而引起的。但是如果<partial-response>JSF ajax 响应中缺少根元素,则特定于浏览器的 XML 解析器将/可能会显示这种错误。

您需要改为通过同步请求下载文件。删除<f:ajax>或将 3rd 方组件的任何 ajax-toggling 属性设置为false,例如<p:commandButton ajax="false">.

您无需担心浏览器中的页面更改,因为您已设置Content-Disposition: attachment响应标头,当前页面将保持不变。顺便说一下,这个问题绝不是 Commons IO 特有的。

也可以看看:

于 2012-10-01T10:59:10.400 回答