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

Java Jersey servlet返回的zip文件包含的字节比发送的响应多,java,servlets,jersey,zip,servlet-container,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) IOExcepti

我试图实现一个简单的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
的最终响应之间,在文件上写入了一些额外的字节/进行了一些编码

你能帮忙吗

致以最良好的祝愿,
Maxim

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

此解决方案在IE 6-9中不起作用:如果需要支持,请查看JSZip文档:

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