NodeJS 如何使用API Gateway上传xls/xlsx文件并将文件数据发送到lambda函数?

ffx8fchx  于 2023-02-18  发布在  Node.js
关注(0)|答案(5)|浏览(146)

我是lambda和API Gateway的新手。我用这个服务做过一些简单的事情,但是现在我有一个要求,用户可以上传一个excel文件。上传过程只会触发一个API网关端点,这个端点集成了一个lambda函数。我不想保存文件,我只想将CSV/JSON格式的文件数据发送到lambda函数(nodejs代码),然后处理/转换/持久化数据。有人知道怎么做吗?我试过一些方法,但我真的迷路了。

cxfofazt

cxfofazt1#

你可以将文件转换成Buffer对象,然后将上传(使用fs也可以)流传输到API,一旦你在lambda中接收到它作为参数的一部分,你就可以将它再次转换回csv,然后将它写下来/upload to S3/convert to base64 and store in db,无论你的架构建议采用哪种方法。

nnt7mjpx

nnt7mjpx2#

我不会把API网关纳入等式。有大小限制,您的上传到API网关。
浏览器-- CloudFront -- S3存储桶(触发器)-- Lambda
如果您想保护您的端点以上传到S3,您可以使用SignedURL来保护您的端点。
浏览器-- CloudFront -- APIGW -- Lambda(返回签名的URL)--使用上述步骤上载
上传文件后,您可以从Lambda读取S3对象/文件,并在那里处理它。

jum4pzuy

jum4pzuy3#

在我的项目中,我是这样做的:

  1. Frontend将文件转换为base64字符串。
  2. Base64字符串随后包含在JSON有效负载中。
  3. JSON有效负载被发送到API网关POST端点。
  4. API网关触发一个Lambda处理程序,然后将Base64字符串转换为nodejs Buffer对象。
  5. Buffer对象被传递到aws-sdkS3.upload()方法,该方法返回上载对象的S3密钥。
    1.然后,我会将此S3密钥保存到数据库中。
    请注意,这种方法对文件大小有限制(API Gateway的限制),所以我的前端在发送到API之前会检查这个限制。
    如果你想超过API网关的限制,你必须直接从客户端或前端上传到S3。
iswrvxsc

iswrvxsc4#

正如我在我的问题中所说的,我不需要保存文件,我通过API Gateway(代理模式)将文件数据传递给lambda函数,使用parse-multipart解析数据,并使用node-xlsx解析parts缓冲区以获得可读数据。

7eumitmz

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

  • 应用程序/vnd. openxml格式-办公文档.电子表格ml.工作表 *

现在你已经配置了初始设置,现在是时候通过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,
  };

希望这有帮助:)

相关问题