首页 > 解决方案 > 使用 Node.js 将图像上传到 Amazon S3 API

问题描述

我正在制作一个应用程序,它将从浏览器访问手机摄像头。允许用户拍照,然后将照片保存到 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.jsreactjsamazon-web-servicesamazon-s3

解决方案


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

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


推荐阅读