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

How to transfer base64 image from client to server or download binary / base64 from s3 bucket?

在我的应用程序中,我将照片直接从客户端发送到 s3,使用类似于建议的 heroku 推荐的东西:https://devcenter.heroku.com/articles/s3-upload-node

主要好处是它节省了服务器成本(我假设是因为没有使用诸如 multipart-y 表单数据之类的东西将块发送到服务器)。

不过,我希望也能将这些图片分享到推特上,这说明了这个要求:

Ensure the POST is a multipart/form-data request. Either upload the raw binary (media parameter) of the file, or its base64-encoded contents (media_data parameter). Use raw binary when possible, because base64 encoding results in larger file sizes

我试过将客户端 s3 上传所需的 base64 发送回服务器,但取决于照片大小——我经常收到一个错误,说它太大而无法发送回.

TLDR

我是否需要使用多方/多部分表单数据将我的照片发送到我的服务器,以便我可以使用所需的 base64/二进制文件将照片分享到 Twitter,或者我可以继续从我的客户端发送照片到 s3 吗?

然后,不知何故,高效地在服务器上获取所需的base64 /二进制文件(可能使用请求模块),这样我就可以然后将图像发送到推特?

如果您直接从客户端上传文档以上传到 s3,您将向客户端公开您的 AWS secret/private 密钥。一种更安全的方法是将图像上传到节点,然后节点再将其上传到 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);

此方法可以像任何其他 Express 应用程序一样轻松扩展。

在不大量更改客户端代码的情况下,一个相当简单的方法是使用 S3 events。 S3 事件可以触发 AWS 中的 lambda 函数,该函数可以 post 将图像发送到 Twitter。您可以使用 lambda 函数内的任何库来高效 posting 到 Twitter。不确定您是想使用 Lambda 还是坚持使用 Heroku。