使用node.js上传blob文件到S3失败

3

我使用了connect-multiparty中间件,以下是我的代码:

console.log(req.files)

      var data = {
        Key: req.body.filename,
        Body: req.files,
        ContentType: 'image/jpeg'
      };


      s3Bucket.putObject(data,function(err,result){
        console.log(err);
      });

我在终端里得到了以下结果:
{ photo: 
   { fieldName: 'photo',
     originalFilename: 'blob',
     path: '/var/folders/n1/fr69rt5j01sfwjhsh3jx3gh00000gn/T/Tw4pwoPQ5D7zCGxrk3U1ywKp',
     headers: 
      { 'content-disposition': 'form-data; name="photo"; filename="blob"',
        'content-type': 'image/jpeg' },
     size: 50138,
     name: 'blob',
     type: 'image/jpeg' } }
{ [InvalidParameterType: Expected params.Body to be a string, Buffer, Stream, Blob, or typed array object]
  message: 'Expected params.Body to be a string, Buffer, Stream, Blob, or typed array object',
  code: 'InvalidParameterType',

有什么线索表明这不起作用?Body应该是什么值?
2个回答

6

如果您有图像的base64格式,您可以使用以下方法。

此方法的参数为:

1.image:图像的base64格式

2.FileName:文件名字符串,例如:'name.jpg'

var UploadFilesToS3 = function(image,FileName) {  //
    buf = new Buffer(image.replace(/^data:image\/\w+;base64,/, ""),'base64');
    var data = {
        Key: FileName,
        Body: buf,
        ContentEncoding: 'base64',
        ContentType: 'image/jpeg'
    };
    s3Bucket.putObject(data,function (data,err){
        if(err)
        {
            console.log('failed to Upload: '+ err.body);
        }
    });
};

同时,在调用此方法之前,您需要进行AWS配置,如下所示:
var AWS = require('aws-sdk');
AWS.config.update({
        accessKeyId: '',
        secretAccessKey: '',
        region: ''
    });

var s3Bucket = new AWS.S3( { params: {Bucket: 'name of the bucket'} } );

图片来自哪里? - Maria Jane
图片是您需要上传的照片。 - Supraj V
运行得很顺利!谢谢 @Suprajv - roray
1
很棒的答案。你知道为什么我们需要将它转换为缓冲区,而不能直接上传为字符串吗?我相信AWS的putObject方法接受body参数作为字符串、缓冲区、流、Blob或类型化数组对象 - Marklar

0

req.files 不是你需要上传的东西,请尝试以下方法:

var fs = require('fs')
var photo = req.files.photo
var data = {
  Key: req.body.filename,
  Body: fs.createReadStream(photo.path),
  ContentType: photo.type
};

s3Bucket.putObject(data, function (err, result) {
  if (err) console.error(err);
  else console.log(result);
});

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