首页 > 解决方案 > 设置 S3 以在浏览器中加载内容的正确方法是什么?

问题描述

我想做以下事情:浏览器中的用户键入一些文本,然后按“保存”按钮,文本应保存在文件夹中的文件(例如:content.txt)中(例如:/username_text ) 在 S3 存储桶的根上。

另外,我希望用户能够在访问同一页面时从 S3 加载内容并继续处理文件。然后,如果他/她完成,再次将文件保存到 S3。

可能很重要,但我计划将 NodeJS 用于我的后端......

我现在的问题是:设置这个存储和检索的最佳方法是什么?我是否创建一个 API 网关 + Lambda 函数来通过它获取和发布文件?或者我是否例如使用 Node 中的 aws-sdk 直接从 S3 推送和拉取文件?还是有更好的方法来做到这一点?

我查看了以下两个指南:

  1. 在 NodeJS 应用程序中使用 AWS S3 存储桶 – 代码库 – Medium

  2. 使用 AWS API Gateway 和 Lambda 从 S3 上传和检索图像

标签: amazon-web-servicesamazon-s3aws-lambda

解决方案


欢迎来到 StackOverflow!

我认为您对不那么重要的事情担心太多了。S3 只不过是一个存储系统。您可能已经决定将这些文件的内容存储在 DynamoDB、RDS 等上。如果您将其内容存储在这些真实的数据库中,您会怎么做?您会获取数据并将其显示给用户,不是吗?

这就是你需要用 S3 做的事情!S3 在您的场景中是一个明智的选择,因为您的“文件”可能会变得非常大,而 S3 是存储文件的好地方。但是,显然,您实际上并没有存储文件(想想 .pdf、.mp4、.mov 等),您实际上只是存储了人类可读的文本。

因此,这是解决问题的一种方法:

获取文件内容

  1. 用户登录
  2. 您根据某个令牌获取用户的个人信息。您可以将所有元数据存储在 DynamoDB 中,在给定 user_id 的情况下,从该用户获取所有“文件”。这些“文件”(仅限元数据)将是 S3 上实际文件的存储桶和密钥。
  3. 您使用getObjectS3 中的 API 根据您的查询获取文件,并以 RESTful 方式向用户显示文件的正文。您的回复应如下所示:

    {“内容”:“一些内容”}

保存文件内容

  1. 用户登录
  2. 用户在表单中写入任何内容并提交。在您的 Lambda 函数中,您获取此表单的内容并对其进行处理。此请求应如下所示:

    {“file_id”:“some-id”,“user_id”:“some-id”,“content”:“some-content”}

  3. 如果 file_id 存在,则更新 S3 中的内容。否则,在 S3 中上传一个新文件,然后在 DynamoDB 中创建一个新条目。当然,您必须处理提交更改的用户是否确实拥有该文件,但如果您使用的是 UUID,这应该不是太大的问题,但仍然值得检查以防 ID 泄露不知何故。

这样,您无需担心上传/下载文件,因为这些是 CPU 密集型任务,因此您可以降低成本并在函数中使用非常少的 RAM(128MB 应该绰绰有余) ,您现在只提供文本。这不仅会简化您的设计方式,还会使 API Gateway 和代码中的事情变得更简单,因为您不必处理二进制类型。您最多可以在提供某些内容时将缓冲区从 S3 转换为字符串,但这应该完全没问题。

编辑

关于您是否应该从浏览器上传它的问题,我建议您查看这个答案,其中我介绍了通过 API Gateway 与从浏览器上传的优缺点。


推荐阅读