将图像从lambda上传到s3(损坏的文件)

时间:2017-08-08 13:00:50

标签: express amazon-s3 aws-lambda serverless-framework

我创建了一个节点快递应用,它使用multer将图像上传到我的资产中#34; s3桶。将图像上传到s3后,图像处理lambda函数将获取图像,并将其大小调整为另一个s3存储桶。

上传脚本:

var assetsBucketIn = new AWS.S3({
  accessKeyId     : "...",
  secretAccessKey : "...",
  region          : "...",
  params : {
    Bucket : "..."
  }
});

var uploadAssets     = multer({inMemory : true});
var imgFieldSettings = [
  {
    name     : 'uploadFiles',
    maxCount : 7
  }
];

router.post('/images', uploadAssets.fields(imgFieldSettings), (req, res, next) => {
  ...
  uploadPromises = [];
  for(let i = 0; i < req.files.uploadFiles.length; i++){
    let params = {
      Key  : path.join(srcPath, srcName),
      Body : req.files.uploadFiles[i].buffer
    };
    let uploadPromise = assetsBucketIn.upload(params).promise();
    uploadPromises.push(uploadPromise);
  }

  Promise.all(uploadPromises)
   .then(...).catch(...);

我可以在localhost上运行这个快速应用程序而没有任何问题,但是当我使用aws-serverless-express运行lambda的快速应用程序时,我无法访问该图像(拒绝访问)和图像处理lambda函数给出了以下日志错误:

  

TypeError:无法读取属性&#39; width&#39;未定义的gm。   (/var/task/index.js:103:50)at emitMany(events.js:127:13)at gm.emit   (events.js:201:7)在gm。   (/ var /task/node_modules/gm/lib/getters.js:70:16)在cb   (/var/task/node_modules/gm/lib/command.js:322:16)at at   ChildProcess.onExit(/var/task/node_modules/gm/lib/command.js:305:9)   在ChildProcess.emit的emitTwo(events.js:106:13)(events.js:191:7)   在Socket的maybeClose(internal / child_process.js:886:16)。   (内部/ child_process.js:342:11)

gm是节点

的GraphicsMagick和ImageMagick模块

我想问题出在快递应用程序中,我使用serverless在aws lambda上运行。也许它与multer设置有问题,这与lambda环境有冲突?我的assetsBucket拥有&#34; AmazonS3FullAccess&#34;顺便说一句。

更新

实际上我刚刚发现问题不是访问权限,没关系,公共访问被拒绝(sry for the missleading information)。当我下载上传到我的资产桶的图像时,我无法打开它并获得以下错误代码:

  

解释JPEG图像文件时出错(不是JPEG文件:以0xef开头   为0xBF)

但是,只有当我使用aws lambda(无服务器)上传图片时,我才会收到此错误,当我在本地运行上传过程时,文件的一切似乎都很好,所以不知何故< strong>通过lambda上传时文件损坏

1 个答案:

答案 0 :(得分:3)

在我的情况下,它是API网关故障,事实证明你必须启用二进制支持,否则,lambda函数永远不会收到二进制内容:

  1. 转到ApiGateway端点的设置
  2. 转到二元媒体类型
  3. 添加新的二进制类型并放入:image / jpg
  4. 此外,如果您的Lambda功能位于VPC和安全组之后,请首先检查它是否在没有VPC的情况下工作。

相关问题