Файл возвращается методом восстановления с дополнительными байтами - PullRequest
1 голос
/ 25 марта 2020

Я пытаюсь вернуть двоичный файл в ответ на запрос 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();
             }
    });

Любые идеи будут оценены

1 Ответ

0 голосов
/ 30 марта 2020

На самом деле я нашел обходной путь, но проблема до сих пор не решена. Я изменил свой API на @GET и запросил его с помощью

[HTML]

<form class="form-horizontal" action="/rest/api/$param/method" method="get" id="my_form"> 

[JS]

$("#export_player_form").submit()
...