使用 AWS api 网关将图像文件上传到 aws lambda
Image file upload to aws lambda using AWS api gateway
我正在尝试创建一个接受图像作为 multipart/form-data 的 lambda 函数,对图像进行一些处理并将其上传到 s3 并 returns 响应客户端。
但是我停留在使用 API 网关将图像上传到 aws lambda 的第一部分。
我尝试在 NodeJS 中执行此操作,如下所示:
exports.handler = async (event, context, callback) => {
var buf = Buffer.from(event.body.replace(/^data:image\/\w+;base64,/, ""),"base64");
var data = {
Bucket: "bucket-name",
Key: "abc.jpg",
Body: buf,
ContentType: 'image/jpg',
ACL: 'public-read'
};
data = await s3.upload(data).promise();
return {
statusCode: 200,
body: JSON.stringify(buf),
};
通过向 api 发出 POST 请求,我在 Postman 中得到以下响应:
{
"ETag": "\"b0e5b18d38904f109e0aef0b29e132be\"",
"Location": "https://bucket-name.s3.us-east-2.amazonaws.com/abc.jpg",
"key": "abc.jpg",
"Key": "abc.jpg",
"Bucket": "bucket-name"
}
但是当我尝试使用 public 在浏览器中查看上传的图片时
url 在上面的回复中,我得到的是空图像。
有人可以指出我这里的错误或建议一些更好的方法。
谢谢。
按照Ashan的建议,您可以采用通过浏览器上传图片的最佳做法。
如果图像尺寸不是那么大,here 是通过 ApiGateway/Lambda 代理集成将图像上传到 S3 的工作示例。
Lambda 函数代码 -
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 + ".png"
var params = {
"Body": decodedImage,
"Bucket": "bucketName",
"Key": filePath,
"ContentType " : "mime/png"
};
s3.upload(params, function (err, data) {
if (err) {
callback(err, null);
} else {
let response = {
"statusCode": 200,
"body": JSON.stringify(data),
"isBase64Encoded": false
};
callback(null, response);
}
});
};
Serverless.yml
service: aws-api-lambda-s3-image-upload
frameworkVersion: ">=1.1.0 <2.0.0"
provider:
name: aws
runtime: nodejs8.10
iamRoleStatements:
- Effect: "Allow"
Action:
- "s3:ListBucket"
Resource: "arn:aws:s3:::bucketName"
- Effect: "Allow"
Action:
- "s3:PutObject"
Resource: "arn:aws:s3:::bucketName/*"
functions:
index:
handler: handler.handler
events:
- http: POST handler
Json 负载应该是 -
{
"user_avatar" : "<<base64 encoded image>>"
}
我正在尝试创建一个接受图像作为 multipart/form-data 的 lambda 函数,对图像进行一些处理并将其上传到 s3 并 returns 响应客户端。 但是我停留在使用 API 网关将图像上传到 aws lambda 的第一部分。 我尝试在 NodeJS 中执行此操作,如下所示:
exports.handler = async (event, context, callback) => {
var buf = Buffer.from(event.body.replace(/^data:image\/\w+;base64,/, ""),"base64");
var data = {
Bucket: "bucket-name",
Key: "abc.jpg",
Body: buf,
ContentType: 'image/jpg',
ACL: 'public-read'
};
data = await s3.upload(data).promise();
return {
statusCode: 200,
body: JSON.stringify(buf),
};
通过向 api 发出 POST 请求,我在 Postman 中得到以下响应:
{
"ETag": "\"b0e5b18d38904f109e0aef0b29e132be\"",
"Location": "https://bucket-name.s3.us-east-2.amazonaws.com/abc.jpg",
"key": "abc.jpg",
"Key": "abc.jpg",
"Bucket": "bucket-name"
}
但是当我尝试使用 public 在浏览器中查看上传的图片时 url 在上面的回复中,我得到的是空图像。
有人可以指出我这里的错误或建议一些更好的方法。 谢谢。
按照Ashan的建议,您可以采用通过浏览器上传图片的最佳做法。
如果图像尺寸不是那么大,here 是通过 ApiGateway/Lambda 代理集成将图像上传到 S3 的工作示例。
Lambda 函数代码 -
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 + ".png"
var params = {
"Body": decodedImage,
"Bucket": "bucketName",
"Key": filePath,
"ContentType " : "mime/png"
};
s3.upload(params, function (err, data) {
if (err) {
callback(err, null);
} else {
let response = {
"statusCode": 200,
"body": JSON.stringify(data),
"isBase64Encoded": false
};
callback(null, response);
}
});
};
Serverless.yml
service: aws-api-lambda-s3-image-upload
frameworkVersion: ">=1.1.0 <2.0.0"
provider:
name: aws
runtime: nodejs8.10
iamRoleStatements:
- Effect: "Allow"
Action:
- "s3:ListBucket"
Resource: "arn:aws:s3:::bucketName"
- Effect: "Allow"
Action:
- "s3:PutObject"
Resource: "arn:aws:s3:::bucketName/*"
functions:
index:
handler: handler.handler
events:
- http: POST handler
Json 负载应该是 -
{
"user_avatar" : "<<base64 encoded image>>"
}