将图像上传到S3以获取更大的文件

时间:2018-11-05 06:37:30

标签: node.js amazon-s3 aws-sdk

我一直试图使用以下代码将图像上传到s3

function(base64Image){
let imageBuffer = new Buffer(base64Image.replace(/^data:image\/\w+;base64,/, ""), 'base64');
    return S3.putObject({
      Bucket: `my-bucket`,
      Key: `my-key`,
      Body: imageBuffer,
      ACL: 'public-read',
      ContentType: "image/jpeg",
      ContentEncoding: "base64"
    }).promise()
      .then((response) => {
          })
          .catch((error) => {

          })
      })
}

它可以完美运行,但不适用于较大的文件,因此启动2.0 MB有时会起作用。

您如何解决这个问题?

欢呼

1 个答案:

答案 0 :(得分:0)

您可以使用模块 superagent https://github.com/visionmedia/superagent),该模块支持使用formData上传文件。然后,在后端,您需要使用 multer https://github.com/expressjs/multer)来获取文件。

在前端文件中

//Method to do the request
superagent
.post(/register")
.attach("avatar", uploadedImage)

uploadedImage具有图像内容

在后端文件中

var multer = require('multer')
var upload = multer({ dest: 'uploads/' })
import fs from 'fs-extra'

exports.uploadImage = ((name, image) => {
    AWS.config.update({ 'region': process.env.GROUP_REGION, 'accessKeyId': process.env.AWS_ACCESS_KEY_ID, 'secretAccessKey': process.env.AWS_SECRET_KEY })
    var s3Bucket = new AWS.S3({ params: { Bucket: process.env.S3_BUCKET_NAME } })
    var data = { Key: name, Body: image }
    return new Promise((resolve, reject) => {
        s3Bucket.putObject(data, function (err, data) {
            if (err) {
                console.log('Error uploading data: ', data)
                reject(err)
            } else {
                console.log('succesfully uploaded the image!')
                resolve(data)
            }
        })
    })
})

router.post('/register', upload.single('avatar'), (req, res, next) => {
        return fs.readFile(req.file.path)
                .then(content => {
                    uploadImage("File.jpg", content);
                })
    })

使用此代码,每次将文件内容上载到formdata中的文件/ register时,图像将存储在后端的/ uploads文件夹中,然后存储到S3帐户中。上传后,您可以使用

从上传文件夹中删除文件
fs.remove(req.file.path)