我想在我的React / Redux SPA上创建一个输入,该输入接收一个文件(附件),然后存储在我的Amazon S3存储桶中。
我有输入从本地计算机获取文件并将其发送到我的Node API,我有一个函数获取文件(我的Node环境本地)并将其传输到S3。我甚至让这两个一起工作,从本地机器获取文件并将其写入Node机器,然后获取该文件并将其传输到S3。
问题是在节点计算机上写入文件/从文件读取时间,以及文件保存在临时存储中的磁盘量。我想传输更大的文件(几个演出),然后传输我的Node实例可用的资源(256m磁盘,甚至更少的内存)。我还想避免使用磁盘读/写的时间和资源。
有没有办法让来自浏览器的传入信息流直接传递给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(尤其是闷热!)。如果对其他人来说这很简单,我道歉。
Buffers,Streams以及其他相关的数据类型对我来说也是一个新手。我尽可能快地读书,但我还有很多东西要学习!
为了清晰起见,将会有更多的捕获量被删除。
答案 0 :(得分:0)
Multiparty图书馆来救援。它完全是针对此用例而制作的,因此您无需存储数据。你可以直播它。
他们甚至有example特别针对此用例,您可以直接将图像上传到S3。我没有在这里写任何代码,因为这个例子将为您提供开始所需的一切。
答案 1 :(得分:0)
您可以直接从浏览器将文件上传到S3。 NodeJS服务器创建已签名的请求,并将访问令牌传递给浏览器。
浏览器使用访问令牌将文件直接发送到S3。您可以使用aws-s3-form npm模块。
生成已签名且可以使用的formdata,以便直接从浏览器将文件放入s3。使用AWS签名版本4
进行签名aws-s3-form说明
更多信息