Azure Blob Storage中的批量下载

3
我需要找到一种方法,让我的用户从Azure Blob存储中下载多个PDF文件(有时可能是数千个)。我知道可以并行下载这些文件,可以加快下载速度,但问题在于,用户可能需要下载数千个PDF文件,这完全是不合理的。
另外,我不能将文件下载到另一个服务器上,将它们打包成zip文件,然后让用户从那里下载,因为这对我来说效率极低。
除了上述方法之外,是否有一种方法可以创建文件的zip文件,让用户下载?我看到其他关于此主题的问题,但没有一个答案/解决方案适合我的需求。
那么,最好的方式是什么?或者没有其他方法可以完成这个任务吗?
提前感谢您。

这些PDF文件是否在Azure Blob存储中的一个目录中?如果是,您可以使用批量下载方法而无需将它们压缩。 - Ivan Glasenberg
1个回答

1
由于没有人回答,我在Stack Overflow和其他网站上看到了更多关于此问题的帖子,因此我决定在这里分享我的解决方案(无法共享代码,因为某些原因...)。首先,截至今天2020年4月9日,仍然没有支持从Azure Blob Storage批量下载的支持以zip(或其他格式)的形式直接从Azure到客户端,而不需要通过组织和压缩下载流程的服务器进行路由。
我的问题...
需要从Azure Blob Storage下载(多个)文件,将它们压缩(也许通过文件夹组织),并提示客户以批量方式下载它们而不经过服务器传递任何下载数据,并且不会在客户端下载文件夹中填充散乱的文件...

在我的研究中,我考虑在客户端的javascript中通过内存完成所有操作,然后让客户端下载,但是由于我的下载可能在GB大小范围内,这可能会消耗大量内存。

解决方案...
然后我遇到了一个名为StreamSaver的javascript库,该库使用流写入文件并直接写入客户端机器,这意味着内存开销要小得多。
幸运的是,这个库还允许将文件组织在将提示给用户的'下载目录'中,甚至让我在告诉用户是否要下载之前将该目录压缩,这意味着这个库几乎解决了我所有的问题。
现在我只有一个由JavaScript调用的Web方法,返回所有Azure SAS URL以供下载,其余都在客户端的JavaScript中。

TL;DR:
使用StreamSaver javascript库在客户端下载、整理和压缩所有文件,然后提示用户下载,只使用webmethod获取所有需要下载的url。

我测试过这个解决方案在至少以下浏览器中可行:

  • Chrome;
  • FireFox;
  • Opera;
  • Edge (Chromium)

使用StreamSaver库时遇到的问题...
该库存在一些缺点/问题:

  • 第一,Safari不支持它!有关此问题的更多信息在此处
  • 第二,StreamSaver仅允许将文件压缩到小于4GB,可以使用另一个库来解决此问题...

1
感谢您的回答。另一个缺点是客户端仍然需要下载所有未压缩的数据,而不是从服务器上首先进行数据压缩以获得减小的文件大小。根据数据类型(以及首先可以有效地进行压缩的方式),这可能会导致用户体验显着变慢。不过还是值得研究的! - Tim Iles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接