通过节点浏览器到 S3 文件传输
Browser to S3 file transfer via Node
背景
我想在我的 React/Redux SPA 上创建一个输入,该输入接收一个文件(附件),然后该文件将存储在我的 Amazon S3 存储桶中。
我有输入从本地机器获取文件并将其发送到我的节点 API 很好,我有一个函数获取文件(本地到我的节点环境)并将其传输到 S3 很好。我什至让这两者一起工作,从本地机器获取文件并将其写入节点机器,然后获取该文件并将其传输到 S3。
为什么这对我不起作用
问题是在节点机器上从文件时间写入 file/read,以及保存在临时存储中的文件所使用的磁盘量。我想传输比我的 Node 实例可用的资源(256m 磁盘甚至更少的内存)大得多的文件(几千兆)。我还想避免使用磁盘 reads/writes.
的时间和资源
问题
有没有什么方法可以让来自浏览器的传入信息流直接传递到 S3,而无需将其存储在本地磁盘或内存中?
我现在在哪里
app.post(`${base}/putattachment`, multer({dest: './attachments'}).single('file'), async (req, res)=> {
const result = await Put(req.file.path, req.body.key);
res.send(result);
});
export const Put = (file, s3Key)=>{
return new Promise((resolve)=>{
const s3 = new AWS.S3();
const params = {Bucket: BUCKET_NAME, Key: s3Key, Body: file};
s3.putObject(params, (s3err) => {
if (!s3err){
resolve(s3Key);
}
});
})
};
免责声明
文件传输对我来说比较陌生。 S3 和 Express(尤其是 multer!)也是如此。如果这对其他人来说很简单,我深表歉意。
缓冲区、流和其他在这里非常重要的相关数据类型对我来说也有些陌生。我正在尽可能快地阅读,但我还有很多东西要学!
将有更多捕获物,为清楚起见,考虑到在线格式,已将其删除。
Multiparty 库来拯救。它正是为这个用例而制作的,因此您不必存储数据。你可以流式传输它。
他们甚至有一个 example 专门用于您可以直接将图像上传到 S3 的用例。我不会在这里编写任何代码,因为此示例将为您提供入门所需的一切。
您可以直接从浏览器上传文件到S3。 NodeJS 服务器创建一个签名请求并将访问令牌传递给浏览器。
浏览器使用访问令牌将文件直接发送到 S3。您可以为此使用 aws-s3-form npm 模块。
Generate a signed and ready to use formdata to put files to s3 directly from the browser. Signing is done by using AWS Signature Version 4
aws-s3-form Description
更多信息
背景
我想在我的 React/Redux SPA 上创建一个输入,该输入接收一个文件(附件),然后该文件将存储在我的 Amazon S3 存储桶中。
我有输入从本地机器获取文件并将其发送到我的节点 API 很好,我有一个函数获取文件(本地到我的节点环境)并将其传输到 S3 很好。我什至让这两者一起工作,从本地机器获取文件并将其写入节点机器,然后获取该文件并将其传输到 S3。
为什么这对我不起作用
问题是在节点机器上从文件时间写入 file/read,以及保存在临时存储中的文件所使用的磁盘量。我想传输比我的 Node 实例可用的资源(256m 磁盘甚至更少的内存)大得多的文件(几千兆)。我还想避免使用磁盘 reads/writes.
的时间和资源问题
有没有什么方法可以让来自浏览器的传入信息流直接传递到 S3,而无需将其存储在本地磁盘或内存中?
我现在在哪里
app.post(`${base}/putattachment`, multer({dest: './attachments'}).single('file'), async (req, res)=> {
const result = await Put(req.file.path, req.body.key);
res.send(result);
});
export const Put = (file, s3Key)=>{
return new Promise((resolve)=>{
const s3 = new AWS.S3();
const params = {Bucket: BUCKET_NAME, Key: s3Key, Body: file};
s3.putObject(params, (s3err) => {
if (!s3err){
resolve(s3Key);
}
});
})
};
免责声明
文件传输对我来说比较陌生。 S3 和 Express(尤其是 multer!)也是如此。如果这对其他人来说很简单,我深表歉意。
缓冲区、流和其他在这里非常重要的相关数据类型对我来说也有些陌生。我正在尽可能快地阅读,但我还有很多东西要学!
将有更多捕获物,为清楚起见,考虑到在线格式,已将其删除。
Multiparty 库来拯救。它正是为这个用例而制作的,因此您不必存储数据。你可以流式传输它。
他们甚至有一个 example 专门用于您可以直接将图像上传到 S3 的用例。我不会在这里编写任何代码,因为此示例将为您提供入门所需的一切。
您可以直接从浏览器上传文件到S3。 NodeJS 服务器创建一个签名请求并将访问令牌传递给浏览器。
浏览器使用访问令牌将文件直接发送到 S3。您可以为此使用 aws-s3-form npm 模块。
Generate a signed and ready to use formdata to put files to s3 directly from the browser. Signing is done by using AWS Signature Version 4
aws-s3-form Description
更多信息