s3.upload()有效,但上传损坏的图像

时间:2019-01-01 21:06:20

标签: amazon-web-services amazon-s3 aws-lambda serverless-framework

我在AWS中有一个Lambda函数,该函数与POST方法相关,该函数基本上获取图像URL并将图像上传到S3存储桶。

我的Lambda函数如下所示:

var s3 = new AWS.S3();

exports.handler = (event, context, callback) => {
  let encodedImage = JSON.parse(event.body).user_avatar;
  let decodedImage = Buffer.from(encodedImage, 'base64');
  var filePath = "avatars/" + event.queryStringParameters.username + ".jpg"

  var params = {
    "Body": decodedImage,
    "Bucket": "MYBUCKETNAME.com",
    "Key": filePath
  };
  s3.upload(params, function (err, data) {
    if (err) {
      callback(err, null);
    } else {
      let response = {
        "statusCode": 200,
        "headers": {
          "my_header": "my_value"
        },
        "body": JSON.stringify(data),
        "isBase64Encoded": false
      };
      callback(null, response);
    }
  });
};

似乎将图像上传到指定的存储桶,但是当我查看图像时,它似乎已损坏。

enter image description here

对于AWS提供的GUI之外的任何内容,我都没有经验。如果有人对可能发生的事情有任何想法,我将不胜感激。预先感谢!

2 个答案:

答案 0 :(得分:1)

上载图像文件时,还应指定内容类型。对于jpeg,它是image/jpeg。对于png为image/png。如果您忽略内容类型,则图像可能根本不会显示(只有黑色空间)。

Content-Type

有一些node.js库可以为您确定图像类型。这只是许多此类库之一:

image-type

var params = {
  Body: decodedImage,
  Bucket: "MYBUCKETNAME.com",
  Key: filePath,
  Content-Type: 'image/jpeg'
};

答案 1 :(得分:0)

对于那些仍在处理类似问题的人。还请考虑一下,如果您在上传后读取文件,然后发送相同的文件而不将光标重置为0,则会损坏文件,因为S3将从光标所在的位置开始读取。就我而言,我正在阅读以找出图像的内容。

因此,如果您在调用upload_fileobj之前重置了游标,它将对其进行修复:

    try:
        file.seek(0) //resets the cursor.
        s3_client.upload_fileobj(
            file,
            bucket_name,