如何将base64映像从客户端传输到服务器或从s3存储桶下载binary / base64?

在我的应用程序中,我直接从客户端发送照片到S3,使用类似于这个build议的英雄推荐: https ://devcenter.heroku.com/articles/s3-upload-node

主要好处是它节省了服务器成本(我假设,因为块没有被发送到服务器使用诸如multipart-yforms的数据)。

不过,我希望能够将这些图像分享给Twitter,其中说明了这一要求:

确保POST是一个多部分/表单数据请求。 请上传文件的原始二进制文件(媒体参数)或其base64编码的内容(media_data参数)。 尽可能使用原始二进制,因为base64编码会导致较大的文件大小

我曾尝试将客户端s3上传所需的base64发送回服务器,但根据照片大小的不同,我经常会收到一个错误,说明发送回来太大了。

TLDR

我是否需要使用mulitparty / multipart表单数据将我的照片发送到我的服务器,以便我可以将所需的base64 /二进制文件分享到Twitter的照片,还是可以将照片从我的客户端发送到s3?

然后,不知何故, 有效地获得所需的base64 /二进制在服务器上(可能使用请求模块),所以我可以发送图像到Twitter?

一个相当简单的方法来做到这一点,而不用改变你的客户端代码很多将使用S3事件 。 S3事件可以在AWS中触发一个可以将图像发布到twitter的lambda函数。 您可以使用lambda函数内的任何库来高效地发布到twitter。 不知道是否要使用Lambda或坚持Heroku。

如果您直接从客户端上传文档以上传到s3,则您正在向客户端展示您的AWS秘密/私钥。 更安全的方法是将图像上传到节点和节点,然后将其上传到S3。 将图像上传到节点服务器的推荐方法是使用multipart / form-data并使用Multer中间件。

无论上传方法如何,您都可以使用以下代码将图像提供给Twitter。 此代码使用AWS-SDK模块。

var s3 = new AWS.S3(); var filename = req.query.filename; var params = { Bucket: <bucketname>, Key: <image path> }; var extension = filename.split('.')[1]; if (extension == "jpg" || extension == "JPG" || extension == "jpeg" || extension == "JPEG") { res.setHeader('Content-Type', 'image'); } else if (extension == "png" || extension == "PNG") { res.setHeader('Content-Type', 'image/png'); } s3.getObject(params).createReadStream().pipe(res); 

这种方法可以像任何其他快速应用程序一样轻松扩展。