【问题标题】:Upload image to AWS S3 bucket using Node. JS使用 Node.js 将图像上传到 AWS S3 存储桶。 JS
【发布时间】:2019-03-18 14:13:28
【问题描述】:

我正在尝试使用 node.js 从网页将图像上传到我的 S3 存储桶。我可以创建一个文件夹,但是将图像文件上传到该文件夹​​对我不起作用。这是我在 package.json 中的依赖项

"dependencies": {
    "aws-sdk": "^2.331.0",
    "bcrypt-nodejs": "0.0.3",
    "busboy": "^0.2.14",
    "busboy-body-parser": "^0.3.2",
    "connect-busboy": "0.0.2",
    "ejs": "^2.6.1",
    "express": "^4.16.3",
    "express-handlebars": "^3.0.0",
    "express-session": "^1.15.6",
    "mysql": "^2.16.0",
    "mysql2": "^1.6.1",
    "passport": "^0.4.0",
    "passport-local-sequelize": "^0.8.0",
    "path": "^0.12.7",
    "sequelize": "^4.39.0"
  }

这是我正在使用的 api_routes.js 文件的一部分

const bucketName = 'socialmemedia';
const bucketRegion = 'us-east-1';

AWS.config.update({
  region: bucketRegion
});
AWS.config.apiVersions = {
  s3: '2006-03-01',
};

const s3 = new AWS.S3();

module.exports = function (app) {
 // upload image to S3
  app.post("/api/upload", function (req, res) {
    const file = (req.body.imageUpload);
    const busboy = new Busboy({
      headers: req.headers
    });
    busboy.on('finish', function () {
      console.log('Upload finished');
      console.log(file);
      uploadToS3(file);
    });
     req.pipe(busboy);
  });


  function uploadToS3(file) {
    // console.log(req.body);

    const folder = (req.user.username + "/")
    console.log("Folder name: " + folder);
    const params = {
      Bucket: bucketName,
      Key: folder,
      ACL: 'public-read',
      Body: stream
    };

    s3.upload(params, function (err, data) {
      if (err) {
        console.log("Error: ", err);
      } else {
        console.log("Successfully created a folder on S3");
        
      }
    });
    res.redirect("/feed");
  }

};

这里是sn-p的形式

<form action="/api/upload" method="POST" class="image-form">
        <input id="image-upload" class="file-add" type="file" accept="image/*" name="imageUpload"/>
        <button type="submit" id="image-upload" class="sinsup-button">Upload Image</button>
</form>

关于如何让图像实际上传到 S3 存储桶的任何想法?

【问题讨论】:

    标签: javascript node.js amazon-web-services amazon-s3 image-uploading


    【解决方案1】:

    我想通了,谢谢你的帮助@me。我使用的是 s3.upload 而不是 s3.putObject。回答以帮助将来可能遇到此问题的任何其他人。

      // upload image to S3
      app.post("/api/upload", function (req, res) {
        const folder = (req.user.username + "/");
        const file = (req.body.imageUpload);
        const params = {
          Bucket: bucketName,
          Key: (folder + file),
          ACL: 'public-read',
          Body: file
        };
        console.log("Folder name: " + folder);
        console.log("File: " + file);
        
    
        s3.putObject(params, function (err, data) {
          if (err) {
            console.log("Error: ", err);
          } else {
            console.log(data);
          }
        });
        res.redirect("/feed");
      });

    【讨论】:

    • 与 putObject,我使用缓冲区,它只上传第一个缓冲区,知道吗?
    • 不确定为什么要使用缓冲区来上传图片,如果您可以使用 Key 作为文件名和 Body 作为实际文件执行上述操作,请记住我们必须将文件正确引用到 Body,否则我们可以看到文件上传到 S3,但在下载时会出现文件格式问题。
    【解决方案2】:

    简单的答案是在密钥中提及您的文件夹名称 s3 将其标识为文件夹名称并将文件存储在其中

     const params = {
       Bucket: bucketName,
       Key: `${folder}/${file.filename}`, 
       Body: fileContent,
       ContentType: file.mimetype,
     };
    
     // Uploading files to the bucket
     s3.upload(params);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-30
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 2018-07-13
      • 2017-02-01
      相关资源
      最近更新 更多