Jersey servlet返回的zip文件包含的字节数多于发送的响应数

时间:2014-06-15 17:02:09

标签: java servlets jersey zip servlet-container

我试图实现一个简单的servlet,它返回一个捆绑在应用程序中的zip文件(简单资源)

所以我在服务器端实现了以下方法:

@GET
@Path("{path}/{zipfile}")
@Produces("application/zip")
public Response getZipFile(
        @PathParam("path") String pathFolder,
        @PathParam("zipfile") String zipFile) IOException {
    String fullPath= String.format("/WEB-INF/repository/%s/%s",
            pathFolder, zipFile);
    String realPath = ServletContextHolder.INSTANCE.getServletContext()
            .getRealPath(fullPath);
    File file = new File(realPath );

     ResponseBuilder response = Response.ok((Object) file);
     return response.build();
}

当我从borwser调用此方法时,会下载zip文件,其大小与服务器中原始zip的字节数相同。

但是,当我使用客户端代码中的简单XMLHttpRequest调用它时:

        var oXHR = new XMLHttpRequest();
        var sUrl = "http://localhost:8080/path/file.zip"
        oXHR.open('GET', sUrl);
        oXHR.responseType = 'application/zip';
        oXHR.send();

我可以在Chrome的开发者工具的网络标签中看到内容大小较大,而且我无法处理此zip文件(例如JSzip无法识别它)。

似乎介于我的响应和org.glassfish.jersey.servlet.ServletContainer的最终响应之间,写入了一些额外的字节/在文件上完成了一些编码。

你能帮忙吗?

最诚挚的问候, 马克西姆

1 个答案:

答案 0 :(得分:0)

当您使用ajax请求时,浏览器需要文本(默认情况下)并尝试从UTF-8解码(破坏您的数据)。 尝试使用oXHR.responseType = "arraybuffer";:这样,浏览器就不会更改数据并为您提供原始内容(将在oXHR.response中)。

此解决方案在IE 6-9中无效:如果您需要支持,请查看JSZip文档:http://stuk.github.io/jszip/documentation/howto/read_zip.html

如果这不是正确的解决方案,请尝试直接下载zip文件(不涉及任何js代码),以检查问题是来自js端还是来自java端。