首页 > 解决方案 > 将文件从 java 发送到 Angular 是畸形/编码数据

问题描述

我有两种类型的文件需要从我的服务器发送到客户端。我在服务器上使用 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

当我在发送文件之前对其进行十六进制转储时,我们会看到以下内容:

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  

至于上述替代方案,我已经尝试过:

在每次测试中,我发现由于某种原因,我的文本文件运行良好,但 pcap 总是格式错误。

标签: javaencodingrestangular

解决方案


所以事实证明restangular正在篡改数据。将 a 添加.withHttpConfig({responseType: 'arraybuffer'})到调用堆栈中有效。


推荐阅读