Я пытаюсь вернуть двоичный файл в ответ на запрос HTTP POST. Мой API выглядит следующим образом:
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@POST
@Path("/{param}/path")
public @NotNull Response exportPlayer(@NotNull @PathParam("param") Param param,
@Nullable @FormParam("formParam") Param2 param2) {
final byte[] resultFileContent = getResultContent(); //returns some binary serialized information
return Response.ok(resultFileContent ).header("content-disposition", "attachment; filename = myfile").build();
}
В этом байтовом массиве первые четыре байта представляют собой целое число, обозначающее размер следующего содержимого, например:
**00 00 00 F0** 31 33 35 34 30 38 34 3B 36 36 3B 5C
4E 3B 5C 4E 3B 32 30 32 30 2D 30 33 2D 31 30 20
...
Здесь 00 00 00 F0 означает, что следующий блок контента содержит 240 байтов, а остальные байты являются самим контентом
Этот файл возвращается правильно при использовании curl
>curl --user user:password -X POST --data "formParam=value" "http://127.0.0.1:8085/rest/api/param/export" > testExport.bin
Проблема возникает, когда я вызываю этот API через браузер в моей сети клиент. Он начинает возвращать некоторые дополнительные байты в начале файла:
**00 00 00 EF BF BD** 31 33 35 34 30 38 34 3B 36 36
3B 5C 4E 3B 5C 4E 3B 32 30 32 30 2D 30 33 2D 31
содержимое такое же, но первые два байта кажутся поврежденными. Вот как я загружаю файл:
$.ajax({
url: /*my url*/,
data: data
method: "POST",
error: /*some handler*/,
success: answer => {
const link = $('<a>', {
href: 'data:application/octet-stream;charset=utf-8,' + encodeURIComponent(answer),
download: "player_" + playerId
}).css('display', 'none')
.appendTo('body');
link.get(0).click();
link.remove();
}
});
Любые идеи будут оценены