浏览器通过Node传输到S3文件

时间:2017-02-06 16:20:27

标签: node.js file express amazon-s3 transfer

背景

我想在我的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以及其他相关的数据类型对我来说也是一个新手。我尽可能快地读书,但我还有很多东西要学习!

为了清晰起见,将会有更多的捕获量被删除。

2 个答案:

答案 0 :(得分:0)

Multiparty图书馆来救援。它完全是针对此用例而制作的,因此您无需存储数据。你可以直播它。

他们甚至有example特别针对此用例,您可以直接将图像上传到S3。我没有在这里写任何代码,因为这个例子将为您提供开始所需的一切。

答案 1 :(得分:0)

您可以直接从浏览器将文件上传到S3。 NodeJS服务器创建已签名的请求,并将访问令牌传递给浏览器。

浏览器使用访问令牌将文件直接发送到S3。您可以使用aws-s3-form npm模块。

  

生成已签名且可以使用的formdata,以便直接从浏览器将文件放入s3。使用AWS签名版本4

进行签名      

aws-s3-form说明

更多信息