Сервлет 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.