Сервлет Jersey возвращает ZIP-файл, который содержит больше байтов, чем отправлено

Я пытаюсь реализовать простой сервлет, который возвращает 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 ответ

Когда вы используете 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.

Другие вопросы по тегам