Отправка файла из Java в Angular искажает / кодирует данные - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть два типа файлов, которые мне нужно отправить с моего сервера на клиент. Я использую angularjs в качестве клиентской стороны и Java на сервере. У меня нет проблем с отправкой текстовых файлов и загрузкой их содержимого в файл. Где я попадаю в ловушку, это pcap. В некоторых случаях я хочу запросить pcap и скачать. Но что-то кодирует данные, и я не совсем уверен, что. Я часами пробовал следующее и несколько разных комбинаций вещей.

Моя Java выглядит так:

  @GET
  @Produces({MediaType.APPLICATION_OCTET_STREAM})
  @Path("/{id}/packet/download")
  public static Response downloadFile(String filePath) {
    ResponseBuilder rb;
    File file = new File(filePath);

    if (file.exists()) {
      rb = Response.ok(file, mimeType);
      rb.header("Content-Disposition", "attachment; filename=" + file.getName());
      rb.header("Content-Length", file.length());
    } else { //
      rb = Response.status(Status.NOT_FOUND);
    }

    return rb.build();
  }

И мой JavaScript:

that.savePacket = function(item) {
  var url = 'rs/' + that.baseUrl + '/' + item.r$itemData.id + '/packet/download';
  return restangularInstance.one(url).get().then(function(response) {
    var file = {};
    file.name = parseFileName(response.headers('Content-Disposition'));
    file.data = response.data;
    file.isText = file.name.endsWith('.txt');
    var blob = new Blob([response.data], {type: 'application/octet-stream'});
    var a = document.createElement('a');
    a.href = URL.createObjectURL(blob);
    a.download = file.name;
    a.click();
    return file;
  });
};

На принимающей стороне правильно открывается диалоговое окно сохранения загрузки, и файл загружается. Однако по той или иной причине вы можете сказать, что данные были подделаны по пути, когда это pcap.

Когда я беру hexdump файла перед отправкой, мы видим следующее:

0000000 c3d4 a1b2 0002 0004 0000 0000 0000 0000
0000060 9090 9090 9090 9090 9090 9090 9090 9090

Но после загрузки файла я вижу:

0000000 bfef c3bd efb2 bdbf 0002 0004 0000 0000
0001190 bfef efbd bdbf bfef efbd bdbf bfef efbd
00011a0 bdbf bfef 00bd  

Насколько я попробовал альтернативу вышеописанному:

  • Files.readAllBytes(path); и вставка байтового массива в ответ
  • String mimeType = new MimetypesFileTypeMap().getContentType(file); и вставка типа в тип при создании ответа.
  • принуждение к пантомиме application/cap

При каждом тесте я обнаруживал, что по тем или иным причинам мои текстовые файлы работали нормально, но pcap всегда искажался.

1 Ответ

0 голосов
/ 27 апреля 2018

Так что получается, что Restangular подделал данные. Добавление .withHttpConfig({responseType: 'arraybuffer'}) в стек вызовов сработало.

...