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

9
在我的应用程序中,我正在使用类似于Heroku建议的方法将照片直接从客户端发送到S3:https://devcenter.heroku.com/articles/s3-upload-node。主要好处是节省服务器成本(因为不会像使用multipart-y表单数据那样将块发送到服务器)。
但是,我希望也能够分享这些图像到Twitter,它需要以下要求:
确保POST请求是multipart/form-data请求。要么上传文件的原始二进制(media参数),要么上传其base64编码内容(media_data参数)。尽可能使用原始二进制,因为base64编码会导致文件大小更大。
我已经尝试将客户端S3上传所需的base64发送回服务器,但根据照片大小,我经常会收到返回太大的错误。
简而言之,我是否需要使用多部分/多部件表单数据将照片发送到服务器,以便我可以获得所需的base64 /二进制以共享照片到Twitter,还是可以继续从客户端发送照片到S3?然后,以某种方式(可能使用请求模块)在服务器上高效地获取所需的base64 /二进制,以便我可以将图像发送到Twitter?
2个回答

2

有一个相当简单的方法可以实现这一点,而不需要大量更改客户端代码,那就是使用S3事件。 S3事件可以触发AWS中的lambda函数,该函数可以将图像发布到Twitter。您可以在lambda函数中使用任何库来有效地发布到Twitter。不确定您是否想使用Lambda还是坚持使用Heroku。


0

如果您直接从客户端上传文档以上传到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);

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


您无需暴露AWS凭证即可允许最终用户直接上传到S3。请查阅“使用预签名URL上传对象”。 - chris
是的,我的凭据已经在服务器上得到了安全保护。 - NoobSter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接