我在 Amazon s3 存储桶中有一堆文件,我想压缩这些文件并使用 Java Spring 通过 S3 URL 下载获取内容。
原文由 jeff ayan 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在 Amazon s3 存储桶中有一堆文件,我想压缩这些文件并使用 Java Spring 通过 S3 URL 下载获取内容。
原文由 jeff ayan 发布,翻译遵循 CC BY-SA 4.0 许可协议
将它们压缩到你的末端而不是在 AWS 中,最好是在前端,直接在用户浏览器上。您可以在 javascript 中流式传输多个文件的下载,使用该流创建一个 zip 并将该 zip 保存在用户磁盘上。
将压缩移动到前端的优点:
StreamSaver 可用于此目的,但在他们的压缩示例中( 将多个文件保存为 zip )受限于小于 4GB 的文件,因为它没有实现 zip64。您可以将 StreamSaver 与支持 zip64 的 client-zip 结合起来,像这样(我还没有测试过):
import { downloadZip } from 'client-zip';
import streamSaver from 'streamsaver';
const files = [
{
'name': 'file1.txt',
'input': await fetch('test.com/file1')
},
{
'name': 'file2.txt',
'input': await fetch('test.com/file2')
},
]
downloadZip(files).body.pipeTo(streamSaver.createWriteStream('final_name.zip'));
如果您选择此选项,请记住,如果您在存储桶中启用了 CORS,则需要在压缩完成的位置添加前端 url,就在您的 CORS 配置中的 AllowedOrigins
字段中桶。
关于性能: 正如@aviv-day 在评论中抱怨的那样,这并不适合所有场景。 Client-zip 库有一个基准,可以让您了解这是否适合您的场景。一般来说,如果你有一大堆小文件(我在这里没有关于什么是大文件的数字,但我会说 100 到 1000 之间的数字)压缩它会花费很多时间,而且它会耗尽最终用户的 CPU。此外,如果您为所有用户提供同一组压缩文件,最好将其压缩一个并提供已经压缩的文件。在前端使用这种压缩方法适用于有限的一小组文件,这些文件可以根据用户对下载内容的偏好动态更改。我没有真正测试过这个,我真的认为瓶颈是网络速度而不是压缩过程,因为它是在运行中发生的,我真的不认为有大量文件的场景实际上是一个问题。如果有人对此有基准,很高兴与我们分享!
原文由 javrd 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.2k 阅读
8 回答6.1k 阅读
4 回答3.9k 阅读
1 回答4k 阅读✓ 已解决
3 回答5.9k 阅读
3 回答2.1k 阅读✓ 已解决
2 回答3.1k 阅读
S3 不是文件服务器,也不提供操作系统文件服务,例如数据操作。
如果有很多“巨大”的文件,你最好的选择是
是的,您可以使用 AWS lambda 来做同样的事情,但是 lambda 有 900 秒(15 分钟)的执行超时限制(因此建议分配更多 RAM 以提高 lambda 执行性能)
从 S3 到本地区域 EC2 实例等服务的流量是免费的。
如果您的主要目的只是使用 EC2/etc 服务 读取 同一 AWS 区域内的那些文件,那么您不需要这个额外的步骤。直接访问文件即可。
(更新):正如@Robert Reiz 所提到的,现在您还可以使用 AWS Fargate 来完成这项工作。
笔记 :
建议使用 AWS API 访问和共享文件。如果您打算公开共享文件,则必须认真检查安全问题并施加下载限制。 AWS 流量到互联网从来都不便宜。