我正在寻找在承载令牌保护的api端点上下载大文件(如2 - 4 Gb)的方法,该方法适用于所有常见浏览器(IE 11,Chrome,Firefox,Android浏览器,Safari) 。它应该只适用于角度/ ts和浏览器(不提供应用程序)。
FileSaver的问题
目前我正在使用eligrey/filesaver,它结合了客户端blob下载的所有浏览器特定可能性。通过这种方法,我可以轻松使用持有者令牌(例如,使用http拦截器)。
问题是, IE将内存加速并陷入1.4 GB下载。
StreamSaver的问题
我看到有一种新的现代方式StreamSaver.js,它允许直接在磁盘上流式传输,但它仅适用于chrome和opera。
未受保护的端点问题
这种情况的另一种常见方式是允许下载端点的匿名访问,首先请求一次性令牌,创建包含此令牌的URL,让用户通过浏览器直接下载它并打开一个新的选项卡,并在开始下载后立即关闭它。
此方法需要下载2个请求,并且看起来很华丽,供用户观看。我不确定,如果这适用于移动浏览器(打开新标签下载),它看起来像黑客,至少对我而言。 API必须确保网址仅在短时间内有效和/或不能连续使用2次。
想法,有人吗?
有谁知道一个干净,现代/最先进的技术和这种常见场景的高效方式?
大公司如何处理这个问题(google drive,dropbox,amazaon)?
我个人更愿意让浏览器下载文件(而不是客户端blob下载)。也许有一种方法来注射"当客户端点击(href' ed)链接时,承载令牌作为默认请求标头到浏览器。
为什么现代角度富客户端将受保护的二进制下载委托给浏览器并不容易?
答案 0 :(得分:1)
为什么不用websocket? 期待它可能不是最好的方法(根据这个near similar question的最佳答案),但我复制粘贴@Ibrahim Muhammad的答案,以防它可以帮助你:
您可以使用https://github.com/binaryjs/binaryjs或 https://github.com/liamks/Delivery.js如果你可以运行node.js 服务器
答案 1 :(得分:1)
很遗憾,我不知道有任何方法可以解决有关StreamSaver.js
和jQuery('<form action="' + YOUR_URL + '" method="get"></form>')
.appendTo('body')
.submit()
.remove();
的问题。
尽管如此,我还有一个类似的问题需要解决,它指出了使用&#34;未受保护的端点&#34;的想法。
好吧,我会去为文件创建一次性令牌,当然包含在URL中。 (我知道,我知道,这不是最好的解决方案 - 如果有人想出一个最好的&#34;做法,我会很感激。)
你的想法提到了一个华丽的&#34;和用户讨厌的行为。 我找到了解决这个问题的解决方案&#34;华而不实的&#34;注入一个触发下载的表单的问题。
@endforeach
然后通过浏览器的标准下载对话框处理下载,没有那个令人讨厌的新标签页打开并立即关闭。
注意:
我还没有针对您的尺寸文件对此进行测试。但它适用于文件,直到1GB完美无缺。也许你试一试,我希望这会有所帮助。