У меня есть два типа файлов, которые мне нужно отправить с моего сервера на клиент. Я использую 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 всегда искажался.