我需要从服务器发送到客户端的两种类型的文件。我在服务器上使用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总是格式错误。
答案 0 :(得分:0)
事实证明,restangular正在篡改数据。将.withHttpConfig({responseType: 'arraybuffer'})
添加到调用堆栈中。