如何在 Amazon s3 Bucket 中压缩文件并获取其 URL

新手上路,请多包涵

我在 Amazon s3 存储桶中有一堆文件,我想压缩这些文件并使用 Java Spring 通过 S3 URL 下载获取内容。

原文由 jeff ayan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

S3 不是文件服务器,也不提供操作系统文件服务,例如数据操作。

如果有很多“巨大”的文件,你最好的选择是

  1. 启动一个简单的 EC2 实例
  2. 将所有这些文件下载到 EC2 实例,压缩它们,使用新的对象名称将其重新上传回 S3 存储桶

是的,您可以使用 AWS lambda 来做同样的事情,但是 lambda 有 900 秒(15 分钟)的执行超时限制(因此建议分配更多 RAM 以提高 lambda 执行性能)

从 S3 到本地区域 EC2 实例等服务的流量是免费的。

如果您的主要目的只是使用 EC2/etc 服务 读取 同一 AWS 区域内的那些文件,那么您不需要这个额外的步骤。直接访问文件即可。

(更新):正如@Robert Reiz 所提到的,现在您还可以使用 AWS Fargate 来完成这项工作。

笔记 :

建议使用 AWS API 访问和共享文件。如果您打算公开共享文件,则必须认真检查安全问题并施加下载限制。 AWS 流量到互联网从来都不便宜。

原文由 mootmoot 发布,翻译遵循 CC BY-SA 4.0 许可协议

将它们压缩到你的末端而不是在 AWS 中,最好是在前端,直接在用户浏览器上。您可以在 javascript 中流式传输多个文件的下载,使用该流创建一个 zip 并将该 zip 保存在用户磁盘上。

将压缩移动到前端的优点:

  • 您可以将它与 S3 URL、一堆预签名链接一起使用,甚至可以混合来自不同来源的内容,一些来自 S3,一些来自其他任何地方。
  • 您不会浪费 lambda 内存,也不必启动 EC2 fargate 实例,这样可以节省资金。让用户计算机为您完成。
  • 改善用户体验 - 无需等待创建 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏