amazon-web-services - 设置 S3 以在浏览器中加载内容的正确方法是什么?
问题描述
我想做以下事情:浏览器中的用户键入一些文本,然后按“保存”按钮,文本应保存在文件夹中的文件(例如:content.txt)中(例如:/username_text ) 在 S3 存储桶的根上。
另外,我希望用户能够在访问同一页面时从 S3 加载内容并继续处理文件。然后,如果他/她完成,再次将文件保存到 S3。
可能很重要,但我计划将 NodeJS 用于我的后端......
我现在的问题是:设置这个存储和检索的最佳方法是什么?我是否创建一个 API 网关 + Lambda 函数来通过它获取和发布文件?或者我是否例如使用 Node 中的 aws-sdk 直接从 S3 推送和拉取文件?还是有更好的方法来做到这一点?
我查看了以下两个指南:
解决方案
欢迎来到 StackOverflow!
我认为您对不那么重要的事情担心太多了。S3 只不过是一个存储系统。您可能已经决定将这些文件的内容存储在 DynamoDB、RDS 等上。如果您将其内容存储在这些真实的数据库中,您会怎么做?您会获取数据并将其显示给用户,不是吗?
这就是你需要用 S3 做的事情!S3 在您的场景中是一个明智的选择,因为您的“文件”可能会变得非常大,而 S3 是存储文件的好地方。但是,显然,您实际上并没有存储文件(想想 .pdf、.mp4、.mov 等),您实际上只是存储了人类可读的文本。
因此,这是解决问题的一种方法:
获取文件内容
- 用户登录
- 您根据某个令牌获取用户的个人信息。您可以将所有元数据存储在 DynamoDB 中,在给定 user_id 的情况下,从该用户获取所有“文件”。这些“文件”(仅限元数据)将是 S3 上实际文件的存储桶和密钥。
您使用
getObject
S3 中的 API 根据您的查询获取文件,并以 RESTful 方式向用户显示文件的正文。您的回复应如下所示:{“内容”:“一些内容”}
保存文件内容
- 用户登录
用户在表单中写入任何内容并提交。在您的 Lambda 函数中,您获取此表单的内容并对其进行处理。此请求应如下所示:
{“file_id”:“some-id”,“user_id”:“some-id”,“content”:“some-content”}
如果 file_id 存在,则更新 S3 中的内容。否则,在 S3 中上传一个新文件,然后在 DynamoDB 中创建一个新条目。当然,您必须处理提交更改的用户是否确实拥有该文件,但如果您使用的是 UUID,这应该不是太大的问题,但仍然值得检查以防 ID 泄露不知何故。
这样,您无需担心上传/下载文件,因为这些是 CPU 密集型任务,因此您可以降低成本并在函数中使用非常少的 RAM(128MB 应该绰绰有余) ,您现在只提供文本。这不仅会简化您的设计方式,还会使 API Gateway 和代码中的事情变得更简单,因为您不必处理二进制类型。您最多可以在提供某些内容时将缓冲区从 S3 转换为字符串,但这应该完全没问题。
编辑
关于您是否应该从浏览器上传它的问题,我建议您查看这个答案,其中我介绍了通过 API Gateway 与从浏览器上传的优缺点。
推荐阅读
- jquery - Highcharts Drilldown 以不同方式设置 XAxis 标题
- android - 我如何保护应用程序免受“清除所有”操作
- c# - UWP 向 NavigationView 添加额外选项
- java - 从 JSONObject 父级获取 JSONObject
- testing - Go gRPC 服务器使集成测试失败
- java - NoSuchAlgorithmException:未找到 KeyStore JKS 实现
- javascript - 请解释这行javascript代码
- android - 如何使用 kotlin 在 volley 请求中添加自定义标头
- javascript - NodeJs 中的 ES6 类上下文?或者在 NodeJs 的类中使用“this”?
- npm - 我不断从 npm 收到 `errno 4058`