我是lambda和API Gateway的新手。我用这个服务做过一些简单的事情,但是现在我有一个要求,用户可以上传一个excel文件。上传过程只会触发一个API网关端点,这个端点集成了一个lambda函数。我不想保存文件,我只想将CSV/JSON格式的文件数据发送到lambda函数(nodejs代码),然后处理/转换/持久化数据。有人知道怎么做吗?我试过一些方法,但我真的迷路了。
cxfofazt1#
你可以将文件转换成Buffer对象,然后将上传(使用fs也可以)流传输到API,一旦你在lambda中接收到它作为参数的一部分,你就可以将它再次转换回csv,然后将它写下来/upload to S3/convert to base64 and store in db,无论你的架构建议采用哪种方法。
Buffer
fs
nnt7mjpx2#
我不会把API网关纳入等式。有大小限制,您的上传到API网关。浏览器-- CloudFront -- S3存储桶(触发器)-- Lambda如果您想保护您的端点以上传到S3,您可以使用SignedURL来保护您的端点。浏览器-- CloudFront -- APIGW -- Lambda(返回签名的URL)--使用上述步骤上载上传文件后,您可以从Lambda读取S3对象/文件,并在那里处理它。
jum4pzuy3#
在我的项目中,我是这样做的:
POST
aws-sdk
S3.upload()
iswrvxsc4#
正如我在我的问题中所说的,我不需要保存文件,我通过API Gateway(代理模式)将文件数据传递给lambda函数,使用parse-multipart解析数据,并使用node-xlsx解析parts缓冲区以获得可读数据。
parse-multipart
node-xlsx
7eumitmz5#
我在这个任务上坚持了一段时间这是最终的解决方案,1.通过API网关创建您的API端点。1.创建一个将触发负责上传/获取文件的lambda函数的路由。1.现在转到AWS控制台-〉API网关-〉XYZ API(您刚创建的API)-〉设置enter image description here1.向下滚动到页面末尾,转到二进制介质类型并写入*/*。1.转到API中的Resources,选择您的路径,单击ANY,选择Method Response,最后一步是在响应模型中设置Content Type
*/*
现在你已经配置了初始设置,现在是时候通过lambda函数从s3 bucket中保存和检索xlsx文件了。
上传文件编码
发送二进制格式的文件(为了测试目的,使用postman)。确保您使用的lambda函数具有所需的权限。
const s3 = new AWS.S3(); await s3.createBucket({ Bucket: "Your_Bucket_Name"}).promise(); const saveFileResponse = await s3 .putObject({ Bucket: "Your_Bucket_Name", Body: Buffer.from(event.body, "base64"), Key: "test-file.xlsx", ContentType: event.headers["Content-Type"] }) .promise(); return { statusCode: 200, body: JSON.stringify("New file stored successfully"), };
获取文件代码
const s3Object = await s3 .getObject({ Bucket: "Your_Bucket_Name", Key: "test-file.xlsx", }) .promise(); const responseBody = s3Object.Body.toString("base64"); return { statusCode: 200, body: responseBody, headers: { "Content-Type": s3Object.ContentType, "Access-Control-Allow-Origin": "*", "Content-Disposition": "attachment; filename=test-file.xlsx", }, isBase64Encoded: true, };
希望这有帮助:)
5条答案
按热度按时间cxfofazt1#
你可以将文件转换成
Buffer
对象,然后将上传(使用fs
也可以)流传输到API,一旦你在lambda中接收到它作为参数的一部分,你就可以将它再次转换回csv,然后将它写下来/upload to S3/convert to base64 and store in db,无论你的架构建议采用哪种方法。nnt7mjpx2#
我不会把API网关纳入等式。有大小限制,您的上传到API网关。
浏览器-- CloudFront -- S3存储桶(触发器)-- Lambda
如果您想保护您的端点以上传到S3,您可以使用SignedURL来保护您的端点。
浏览器-- CloudFront -- APIGW -- Lambda(返回签名的URL)--使用上述步骤上载
上传文件后,您可以从Lambda读取S3对象/文件,并在那里处理它。
jum4pzuy3#
在我的项目中,我是这样做的:
POST
端点。Buffer
对象。Buffer
对象被传递到aws-sdk
的S3.upload()
方法,该方法返回上载对象的S3密钥。1.然后,我会将此S3密钥保存到数据库中。
请注意,这种方法对文件大小有限制(API Gateway的限制),所以我的前端在发送到API之前会检查这个限制。
如果你想超过API网关的限制,你必须直接从客户端或前端上传到S3。
iswrvxsc4#
正如我在我的问题中所说的,我不需要保存文件,我通过API Gateway(代理模式)将文件数据传递给lambda函数,使用
parse-multipart
解析数据,并使用node-xlsx
解析parts缓冲区以获得可读数据。7eumitmz5#
我在这个任务上坚持了一段时间这是最终的解决方案,
1.通过API网关创建您的API端点。
1.创建一个将触发负责上传/获取文件的lambda函数的路由。
1.现在转到AWS控制台-〉API网关-〉XYZ API(您刚创建的API)-〉设置enter image description here
1.向下滚动到页面末尾,转到二进制介质类型并写入
*/*
。1.转到API中的Resources,选择您的路径,单击ANY,选择Method Response,最后一步是在响应模型中设置Content Type
现在你已经配置了初始设置,现在是时候通过lambda函数从s3 bucket中保存和检索xlsx文件了。
上传文件编码
发送二进制格式的文件(为了测试目的,使用postman)。确保您使用的lambda函数具有所需的权限。
获取文件代码
希望这有帮助:)