在 JSF 中下载带有 IOUtils 的 zip 文件,并带有 "Empty response, an empty response was recieved from the server" 错误



我正在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();
}
}

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

空响应,从服务器收到一个空响应

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

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

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

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

另请参阅:

  • 如何提供从JSF支持bean下载的文件

最新更新