【发布时间】:2021-10-16 12:35:15
【问题描述】:
我正在将图像文件上传到 Amazon S3 存储桶中;但是,当我从 Amazon S3 存储桶下载文件并尝试打开文件 (jpeg) 时,它会返回一条错误消息,指出“无法打开文件。”
我正在通过 AWS API Gateway 作为 POST 方法发送带有图像文件的多部分请求,并在它运行 lambda 函数以将从多部分请求中获得的图像添加到 S3 存储桶中。可能是什么问题?请帮忙谢谢!
下面的代码是一个将图像文件放入 S3 Bucket 的 lambda 函数。
//* Upload Image into S3 Bucket
require("dotenv").config();
const region = process.env.BUCKET_REGION;
const accessKeyId = process.env.ACCESSKEYID;
const secretAccessKey = process.env.SECRETACCESSKEY;
const AWS = require("aws-sdk");
AWS.config.update({ region: "ap-northeast-1" });
const moment = require("moment");
const busboy = require("busboy");
const getRawBody = require("raw-body");
const { gzipSync } = require("zlib");
const { Buffer } = require("buffer");
const dynamodb = new AWS.DynamoDB.DocumentClient();
const tableName = process.env.USERS_TABLE;
const bucketName = process.env.USERS_PROFILE_BUCKET;
const s3 = new AWS.S3({ region, accessKeyId, secretAccessKey });
const util = require("./util");
exports.handler = async (event, context) =>
new Promise((resolve, reject) => {
const item = {};
const filePromises = [];
var contentType =
event.headers["Content-Type"] || event.headers["content-type"];
var bb = new busboy({ headers: { "content-type": contentType } });
bb.on("file", function (fieldname, file, filename, encoding, mimetype) {
item.filename = filename;
getRawBody(file).then((rawFile) => {
item.data = gzipSync(rawFile);
});
file
.on("data", (data) => {
console.log("File [%s] got %d bytes", filename, data.length);
})
.on("end", () => console.log("File [%s] Finished", fieldname));
})
.on("finish", () => {
console.log("Done parsing form!");
resolve(item);
})
.on("error", (err) => {
console.log("Failed: ", err);
return {
statusCode: 500,
headers: util.getResponseHeaders(),
body: JSON.stringify({
error: "Parsing Failed.",
}),
};
});
bb.end(event.body);
}).then((res) => {
try {
var params = {
Bucket: bucketName,
Key: res.filename,
Body: Buffer(res.data),
ContentType: "image/jpeg",
};
s3.upload(params, function (err, data) {
if (err) {
console.log("ERROR Uploading S3");
console.log(err, data);
throw err;
}
}).promise();
return {
statusCode: 200,
headers: util.getResponseHeaders(),
body: JSON.stringify(Buffer(res.data)),
};
} catch (err) {
console.log("ERROR: " + err);
return {
statusCode: err.statusCode ? err.statusCode : 500,
headers: util.getResponseHeaders(),
body: JSON.stringify({
error: err.name ? err.name : "Exception",
message: err.message ? err.message : "Unknown Error",
}),
};
}
});
【问题讨论】:
-
您是否尝试过使用预签名 URL 立即将图像文件上传到 S3?它可能会完全规避这个问题。更多信息:docs.aws.amazon.com/AmazonS3/latest/userguide/…
-
@stijndepestel 没试过,但会调查一下!谢谢!
-
您可以尝试上传相同的文件并下载,看看问题是否仍然存在,您可以上传另一个文件并查看行为吗?这只是为了确保它不是一次性问题
-
此外,在分段上传中,上传失败的可能性较小。您是否在日志中观察到任何故障?
标签: amazon-web-services amazon-s3 aws-lambda aws-api-gateway serverless-framework