将图像从 lambda 上传到 s3(损坏的文件)
uploading image from lambda to s3 ( corrupted file )
我创建了一个 node express 应用程序,它使用 multer 将图像上传到我的 "assets-in" 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(...);
我可以 运行 本地主机上的这个 express 应用程序没有任何问题,但是当我 运行 使用 aws-serverless-express 通过 lambda 连接 express 应用程序时,我无法访问图像(访问被拒绝)和图像处理 lambda 函数给我以下日志错误:
TypeError: Cannot read property 'width' of undefined at gm.
(/var/task/index.js:103:50) at emitMany (events.js:127:13) at gm.emit
(events.js:201:7) at gm.
(/var/task/node_modules/gm/lib/getters.js:70:16) at cb
(/var/task/node_modules/gm/lib/command.js:322:16) at
ChildProcess.onExit (/var/task/node_modules/gm/lib/command.js:305:9)
at emitTwo (events.js:106:13) at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:886:16) at Socket.
(internal/child_process.js:342:11)
gm 是 node
的 GraphicsMagick 和 ImageMagick 模块
我猜问题出在 express 应用程序中,我正在使用 serverless 在 aws lambda 上 运行 宁。也许是 multer 设置的问题,它与 lambda 环境发生冲突?顺便说一下,我的 assetsBucket 具有 "AmazonS3FullAccess" 角色。
更新:
实际上我刚刚发现问题不是访问权限,没关系,public 访问被拒绝了(对不起,误导性信息)。当我下载上传到我的资产存储桶的图像时,我无法打开它并收到以下错误代码:
Error interpreting JPEG image file (Not a JPEG file: starts with 0xef
0xbf)
但只有当我使用 aws lambda(无服务器)上传图片时才会出现此错误,当我在本地 运行 上传过程时,文件似乎一切正常,所以不知何故 文件在通过 lambda
上传时被破坏了
在我的例子中,这是 API 网关错误,结果你必须启用二进制支持,否则 lambda 函数将永远不会接收二进制内容:
- 转到您的 ApiGateway 端点的设置
- 转到二进制媒体类型
- 添加新的二进制类型并输入:image/jpg
此外,如果您的 Lambda 函数位于 VPC 和安全组之后,请首先检查它是否可以在没有 VPC 的情况下运行。
我创建了一个 node express 应用程序,它使用 multer 将图像上传到我的 "assets-in" 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(...);
我可以 运行 本地主机上的这个 express 应用程序没有任何问题,但是当我 运行 使用 aws-serverless-express 通过 lambda 连接 express 应用程序时,我无法访问图像(访问被拒绝)和图像处理 lambda 函数给我以下日志错误:
TypeError: Cannot read property 'width' of undefined at gm. (/var/task/index.js:103:50) at emitMany (events.js:127:13) at gm.emit (events.js:201:7) at gm. (/var/task/node_modules/gm/lib/getters.js:70:16) at cb (/var/task/node_modules/gm/lib/command.js:322:16) at ChildProcess.onExit (/var/task/node_modules/gm/lib/command.js:305:9) at emitTwo (events.js:106:13) at ChildProcess.emit (events.js:191:7) at maybeClose (internal/child_process.js:886:16) at Socket. (internal/child_process.js:342:11)
gm 是 node
的 GraphicsMagick 和 ImageMagick 模块我猜问题出在 express 应用程序中,我正在使用 serverless 在 aws lambda 上 运行 宁。也许是 multer 设置的问题,它与 lambda 环境发生冲突?顺便说一下,我的 assetsBucket 具有 "AmazonS3FullAccess" 角色。
更新:
实际上我刚刚发现问题不是访问权限,没关系,public 访问被拒绝了(对不起,误导性信息)。当我下载上传到我的资产存储桶的图像时,我无法打开它并收到以下错误代码:
Error interpreting JPEG image file (Not a JPEG file: starts with 0xef 0xbf)
但只有当我使用 aws lambda(无服务器)上传图片时才会出现此错误,当我在本地 运行 上传过程时,文件似乎一切正常,所以不知何故 文件在通过 lambda
上传时被破坏了在我的例子中,这是 API 网关错误,结果你必须启用二进制支持,否则 lambda 函数将永远不会接收二进制内容:
- 转到您的 ApiGateway 端点的设置
- 转到二进制媒体类型
- 添加新的二进制类型并输入:image/jpg
此外,如果您的 Lambda 函数位于 VPC 和安全组之后,请首先检查它是否可以在没有 VPC 的情况下运行。