我们有一个系统,可以处理多个大小从KB到GB的文件。
我们在后端使用Express,并且在客户端使用AngularJS / Restangular。
我们正在相应地获取文件,但是我们遇到了问题。
浏览器不显示下载进度,但是会在通知客户端文件正在下载之前在客户端上缓冲下载。到那时,下载仅包括从内存或本地/临时存储中保存下载,并且只需几秒钟即可完成(而沉默了几分钟)。
我们发现这是因为Restangular的Promise链会阻止进度,直到它解决为止,并且只有在已经从后端下载了整个文件时才解决。
这是我们扩展的客户代码:
downloadFile(params) {
return new Promise((resolve, reject) => {
let rq = Restangular
.one('documents/download')
.withHttpConfig({ responseType: 'blob' });
rq.param = params;
rq.post().then(resolve, reject);
}).then((result) => {
// We go here when the whole file already is downloaded,
// and FileSaver starts displaying the browser progress.
// But then it only serves the data from memory or local storage/temp,
// and completes within a couple of seconds
FileSaver.saveAs(result, fileName);
});
});
Download a file from REST API with Restangular request
但是对于大文件,浏览器会在相当长的时间内无响应。我可以实现一个加载指示器,但是如果我离开当前页面,那将会丢失。
我们看过Download big files,它对不同的解决方案进行了详细的描述,但似乎它们有一组块,我想使用整个文件。
我也看过StreamSaver.js,但是要做到这一点,我需要一个可读的流,据我所知,您不能将其作为REST调用的响应。还是我错了?
此外,Downloading a file sent in response to a POST request via nodejs?建议使用GET,因为它会“让浏览器下载”。尽管这将是我们的目标,但它并没有对它以及2012年以后的内容做进一步的解释。它仍然有意义吗?
Restangular是否有可能,还是我们应该另辟route径?
谢谢。