Я пытаюсь разработать файл для загрузки, используя angular 7. Я использую HttpClient
и FileSaver
для загрузки.У меня проблема в том, что, когда HttpClient делает запрос на загрузку на сервер, он ожидает завершения всего ответа (сохраняет весь файл в памяти браузера), а save dialogue
появляется только в конце.Я считаю, что в случае больших файлов, хранение его в памяти вызовет проблемы.Есть ли способ показать save dialogue
, как только будет получен статус OK, и передать файл в файловую систему.Мне также нужно отправить заголовок авторизации с запросом.
Мой код на стороне сервера:
@RequestMapping(value = "/file/download", method = RequestMethod.GET)
public void downloadReport(@RequestParam("reportId") Integer reportId, HttpServletResponse response) throws IOException {
if (null != reportId) {
JobHandler handler = jobHandlerFactory.getJobHandler(reportId);
InputStream inStream = handler.getReportInputStream();
response.setContentType(handler.getContentType());
response.setHeader("Content-Disposition", "attachment; filename=" + handler.getReportName());
FileCopyUtils.copy(inStream, response.getOutputStream());
}
}
Код моего клиента (угловой)
downloadLinksByAction(id, param) {
this._httpClient.get(AppUrl.DOWNLOAD, { params: param, responseType: 'blob', observe: 'response' }).subscribe((response: any) => {
const dataType = response.type;
const filename = this.getFileNameFromResponseContentDisposition(response);
const binaryData = [];
binaryData.push(response.body);
const blob = new Blob(binaryData, { type: dataType });
saveAs(blob, filename);
}, err => {
console.log('Error while downloading');
});
}
getFileNameFromResponseContentDisposition = (res: Response) => {
const contentDisposition = res.headers.get('content-disposition') || '';
const matches = /filename=([^;]+)/ig.exec(contentDisposition);
return matches && matches.length > 1 ? matches[1] : 'untitled';
};