【问题标题】:Upload an image to Amazon S3 API with Node.js使用 Node.js 将图像上传到 Amazon S3 API
【发布时间】:2019-03-16 18:19:23
【问题描述】:

我正在制作一个可以从浏览器访问手机摄像头的应用。允许用户拍照,然后将照片保存到 Amazon S3 存储桶。我无法成功发布 API 帖子。返回的错误消息只是我发送的很长正文的副本。

这是我的服务器端代码

const fs = require('fs');
const express = require('express');
const pool = require('../modules/pool');
const router = express.Router();
const { rejectUnauthenticated } = require('../modules/authentication-middleware');
const aws = require('aws-sdk');

const s3 = new aws.S3();

aws.config.update({
    accessKeyId: 'Access_KeyID',
    secretAccessKey: 'Access_Key',
    region: 'us-east-2',
});

//POST request to Amazon API
router.post('/', (req,res)=>{
    let pic = req.body.picture[0]
    console.log(pic)
    let params = {
        Bucket: 'beerphoto',
        Key: req.body.filename,
        Body : fs.createReadStream(pic),
        ContentType: 'image/png',
        Expires: 60,
    }
    s3.upload(params, function(err,data){
        if(err) {
            console.log('err')
        }
        if (data) {
            console.log("Uploaded in:", data.Location);
          }
    })

})

module.exports = router;

我想知道问题是否与图片数据有关。这是传递给身体的内容,

"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASQA"

实际的字符串要长得多(大约 26,000 个字符)。任何帮助将不胜感激。

【问题讨论】:

    标签: node.js reactjs amazon-web-services amazon-s3


    【解决方案1】:

    使用fs.createReadStream() 不是您的选择。此方法为来自本地文件系统的数据创建一个流。但是,您的图片已经在 RAM 中,您甚至可以通过 req.body.picture[0] 获得它的参考。根据docs,我认为根本不需要利用流,只需使用您的 base64 字符串,或者转换为 Buffer 实例。

    另外,您提到您在 base64 中的图片大约有 26000 个字符,在 UTF-8 中至少有 52 kbs。想象一下您的服务器有 1000 个带有大图片的请求的高负载,您的进程可能会耗尽内存,因为图片太大而无法放入其中。为避免这种情况,您可以让您的客户端(而非服务器)使用 signed urls 直接安全地(不暴露密钥)上传到 S3。

    【讨论】:

    • 我现在遇到了访问被拒绝的问题。您仅删除 fs.createReadStream() 的解决方案似乎已经解决了我最初的问题。
    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    相关资源
    最近更新 更多