是否有任何标准方法可以解析AWS Lambda中的AWS API 事件内容?
我有这样的lambda nodejs(处理程序)功能。此功能由AWS API Gateway代理集成调用。简而言之,代理集成将http请求原样传递给lambda。
exports.handler = async(event, context, callback) => {
...
}
我的活动将包含图像或文档。换句话说,就目前使用Postman而言,我通过HTTP Post方法将内容上传到AWS API Url。 然后,我想调用包含内容的AWS S3上传。
按原样,如果我们使用JSON.stringify,则事件对象包含这些内容
{
"resource": "/UploadToS3",
"path": "/UploadToS3",
"httpMethod": "POST",
"headers": {
"Accept": "*/*",
"accept-encoding": "gzip, deflate",
"Cache-Control": "no-cache",
"Content-Type": "multipart/form-data; boundary=--------------------------286169661413777803563037",
"Host": "rzm85vjr13.execute-api.us-east-1.amazonaws.com",
"Postman-Token": "84182d22-7193-480f-8642-0fede39b4458",
"User-Agent": "PostmanRuntime/7.11.0",
"X-Amz-Date": "20190506T191534Z",
"X-Amzn-Trace-Id": "Root=1-5cd087d7-73a9f50e5b2c20a2628852fb",
"X-Forwarded-For": "100.18.45.29",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https"
},
"multiValueHeaders": {
"Accept": [
"*/*"
],
"accept-encoding": [
"gzip, deflate"
],
"Cache-Control": [
"no-cache"
],
"Content-Type": [
"multipart/form-data; boundary=--------------------------286169661413777803563037"
],
"Host": [
"rzm85vjr13.execute-api.us-east-1.amazonaws.com"
],
"Postman-Token": [
"84182d22-7193-480f-8642-0fede39b4458"
],
"User-Agent": [
"PostmanRuntime/7.11.0"
],
"X-Amz-Date": [
"20190506T191534Z"
],
"X-Amzn-Trace-Id": [
"Root=1-5cd087d7-73a9f50e5b2c20a2628852fb"
],
"X-Forwarded-For": [
"100.18.45.29"
],
"X-Forwarded-Port": [
"443"
],
"X-Forwarded-Proto": [
"https"
]
},
"queryStringParameters": null,
"multiValueQueryStringParameters": null,
"pathParameters": null,
"stageVariables": null,
"requestContext": {
"resourceId": "f80gn4",
"resourcePath": "/UploadToS3",
"httpMethod": "POST",
"extendedRequestId": "ZRopnE9AIAMF2ig=",
"requestTime": "06/May/2019:19:15:35 +0000",
"path": "/test/UploadToS3",
"accountId": "364714536632",
"protocol": "HTTP/1.1",
"stage": "test",
"domainPrefix": "rzm85vjr13",
"requestTimeEpoch": 1557170135135,
"requestId": "5319988d-7033-11e9-a592-f9fb3565e98f",
"identity": {
"cognitoIdentityPoolId": null,
"accountId": null,
"cognitoIdentityId": null,
"caller": null,
"sourceIp": "100.18.45.29",
"principalOrgId": null,
"accessKey": null,
"cognitoAuthenticationType": null,
"cognitoAuthenticationProvider": null,
"userArn": null,
"userAgent": "PostmanRuntime/7.11.0",
"user": null
},
"domainName": "rzm85vjr13.execute-api.us-east-1.amazonaws.com",
"apiId": "rzm85vjr13"
},
"body": "----------------------------286169661413777803563037\r\nContent-Disposition: form-data; name=\"test\"; filename=\"b002.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n**CONTENT GOES HERE**\r\n",
"isBase64Encoded": false
}
如果我说 event.body ,这就是我们得到的。为了简洁起见,我已经减少了很多图像数据(所有图像数据都在 image / jpeg 和 ---- 之间)。
----------------------------286169661413777803563037
Content-Disposition: form-data; name="test"; filename="b002.jpg"
Content-Type: image/jpeg
����JFIF��C
----------------------------286169661413777803563037--
我必须以某种方式对此进行解析,以获取图像的内容以及可能的类型。 此内容看起来像是HTTP请求的摘录。 如果我按原样使用此内容并将其传递给S3.upload,则以后打开它的格式不是很好。
我在网上看到的一些例子有一些库。 有人可以解释一下为什么我需要这些库来提取S3上传或某些其他功能所需的内容。
答案 0 :(得分:0)
对于将图像上传到S3存储桶的情况,您需要考虑将图像作为Base64传递(使用upload或PutObject方法)。因此,根据我的经验,我可以分享一些注意事项:
...\r\nContent-Type: image/jpeg\r\n\r\n����\u0000\u0010JFIF\u0000\u0001\u00...
通过Postman发送图像时,event.body中的编码不正确,因此在上传到存储桶之前,必须将其转换为Base64。如果不这样做,图像将成功上传但损坏,并且将无法看到任何内容(您会看到一个奇怪的空白框)。在Node.js中,您可以使用Buffer.from(yourstring, 'base64')
来执行它。
不要忘记在s3上传方法的参数中包含“ ContentType”:“ image / jpeg”。