У нас есть устаревший код, который позволяет пользователю сайта загружать файл с сервера.
До сих пор загруженных файлов было CSV
, и у нас не было проблем.
ТеперьНа сервере также есть zip-файл, который содержит CSV.
Сервер генерирует zip-файл правильно ( использовал это руководство ) и на сервере, который мы можем открыть zip-файл,и правильно извлеките внутренний CSV-файл .
Проблема заключается в том, что браузер загружает ZIP-файл: внутренний CSV-файл не имеет суффикса CSV и не может быть открыт.
Ошибка, которую мы получаем (используя 7Zip):
Неожиданный конец данных
Предупреждения:
Ошибка заголовков
Есть некоторые данные послеконец данных полезной нагрузки
Код бэкэнда для обслуживания файла (работает в Spark-Java
микросервисе):
public Object handle(Request request, Response response) throws Exception {
fileName = ...
response.raw().setContentType("application/zip");
response.raw().setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
try (
FileInputStream fis = new FileInputStream(fileName);
BufferedOutputStream bufferedOutputStream = new BufferedOutptStream(response.raw().getOutputStream());
BufferedInputStream bufferedInputStream = new BufferedInputStream(fis)) {
ByteStreams.copy(bufferedInputStream, bufferedOutputStream);
} catch (Exception e) {
....
}
return response.raw();
}
Front end код (Angular 1) для извлечения файла:
$scope.downloadFile = function (fileName) {
$http.get(fileName).
success(function (data, status, headers, config) {
var anchor = angular.element('<a/>');
var headers = headers();
var filename = headers['x-filename'];
var contentType = headers['content-type']
data = new Blob([data], {type: contentType});
var fileUrl = URL.createObjectURL(data);
anchor.attr({
'href': fileUrl,
'target': '_blank',
'download': fileName
})[0].click();
}).error(function (data, status, headers, config) {
$log.info("download " + fileName + " error " + status);
}
);
};