如何管理大文件的下载

时间:2018-07-09 14:58:05

标签: download restangular

我们有一个系统,可以处理多个大小从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径?

谢谢。

0 个答案:

没有答案