FormData 文件上传的 AWS lambda 函数问题
AWS lambda function issue with FormData file upload
我有一个将文件上传到 S3 存储桶的 nodejs 代码。
我使用过 koa web 框架,以下是依赖项:
"@types/koa": "^2.0.48",
"@types/koa-router": "^7.0.40",
"koa": "^2.7.0",
"koa-body": "^4.1.0",
"koa-router": "^7.4.0",
以下是我的示例路由器代码:
import Router from "koa-router";
const router = new Router({ prefix: '/' })
router.post('file/upload', upload)
async function upload(ctx: any, next: any) {
const files = ctx.request.files
if(files && files.file) {
const extension = path.extname(files.file.name)
const type = files.file.type
const size = files.file.size
console.log("file Size--------->:: " + size);
sendToS3();
}
}
function sendToS3() {
const params = {
Bucket: bName,
Key: kName,
Body: imageBody,
ACL: 'public-read',
ContentType: fileType
};
s3.upload(params, function (error: any, data: any) {
if (error) {
console.log("error", error);
return;
}
console.log('s3Response', data);
return;
});
}
请求正文作为 FormData 发送。
现在,当我 运行 在本地编写此代码并点击请求时,文件会上传到我的 S3 存储桶并可以查看。
在 Console 中文件大小显示如下:
这是文件的正确实际大小。
但是当我将此代码部署为 lambda 函数并点击请求时,我发现文件大小突然增加(下面的 cloudwatch 日志屏幕截图)。
该文件仍然上传到 S3,但问题是当我打开该文件时它显示以下错误。
我进一步尝试查找此行为是否在 aws 的独立实例上持续存在。但事实并非如此。因此只有当代码部署为无服务器 lambda 函数时才会出现问题。
我尝试使用邮递员以及我自己的前端应用程序。但问题依旧。
我不知道我在设置处理这种情况的lambda函数时是否忽略了任何配置。
这是我遇到过的前所未有的问题,真的很想知道以前是否有人遇到过同样的问题。此外,我无法调试并找到文件大小增加的原因。我只能假设当文件到达服务时,正在对文件进行某种 encoding/padding。
终于解决了这个问题。必须在 AWS API 网关
中添加“二进制媒体类型”
以下步骤有帮助。
AWS API 网关控制台 -> “API” -> “设置” -> “二进制媒体类型”部分。
添加了以下媒体类型:
multipart/form-data
保存更改。
部署api.
我有一个将文件上传到 S3 存储桶的 nodejs 代码。 我使用过 koa web 框架,以下是依赖项:
"@types/koa": "^2.0.48",
"@types/koa-router": "^7.0.40",
"koa": "^2.7.0",
"koa-body": "^4.1.0",
"koa-router": "^7.4.0",
以下是我的示例路由器代码:
import Router from "koa-router";
const router = new Router({ prefix: '/' })
router.post('file/upload', upload)
async function upload(ctx: any, next: any) {
const files = ctx.request.files
if(files && files.file) {
const extension = path.extname(files.file.name)
const type = files.file.type
const size = files.file.size
console.log("file Size--------->:: " + size);
sendToS3();
}
}
function sendToS3() {
const params = {
Bucket: bName,
Key: kName,
Body: imageBody,
ACL: 'public-read',
ContentType: fileType
};
s3.upload(params, function (error: any, data: any) {
if (error) {
console.log("error", error);
return;
}
console.log('s3Response', data);
return;
});
}
请求正文作为 FormData 发送。
现在,当我 运行 在本地编写此代码并点击请求时,文件会上传到我的 S3 存储桶并可以查看。
在 Console 中文件大小显示如下:
但是当我将此代码部署为 lambda 函数并点击请求时,我发现文件大小突然增加(下面的 cloudwatch 日志屏幕截图)。
该文件仍然上传到 S3,但问题是当我打开该文件时它显示以下错误。
我进一步尝试查找此行为是否在 aws 的独立实例上持续存在。但事实并非如此。因此只有当代码部署为无服务器 lambda 函数时才会出现问题。
我尝试使用邮递员以及我自己的前端应用程序。但问题依旧。
我不知道我在设置处理这种情况的lambda函数时是否忽略了任何配置。
这是我遇到过的前所未有的问题,真的很想知道以前是否有人遇到过同样的问题。此外,我无法调试并找到文件大小增加的原因。我只能假设当文件到达服务时,正在对文件进行某种 encoding/padding。
终于解决了这个问题。必须在 AWS API 网关
中添加“二进制媒体类型”以下步骤有帮助。
AWS API 网关控制台 -> “API” -> “设置” -> “二进制媒体类型”部分。
添加了以下媒体类型:
multipart/form-data
保存更改。
部署api.