AWS:如何修复 S3 事件在 json 中将空格替换为“+”登录对象键名称的问题

我有一个lamba函数,可以将对象从存储桶“A”复制到存储桶“B”,并且一切正常,直到在存储桶“A”中创建名为“New Text Document.txt”的对象,这是在S3事件中构建的json,键为“键”:“New +Text+Document.txt”。

空格被替换为“+”。我知道这是一个已知的问题,通过搜索在网络上。但是我不确定如何解决这个问题,传入的json本身有一个“+”,而“+”实际上可以在文件的名称中。比如“新建+文本文档.txt”。

所以我不能盲目地在我的lambda函数中将“+”与''分开。

由于此问题,当代码尝试在存储桶中查找文件时,它无法找到它。

请建议。


答案 1

我遇到了这个问题,正在寻找用python而不是java编写的lambda的解决方案;“urllib.parse.unquote_plus”对我有用,它正确地处理了一个带有空格和+号的文件:

from urllib.parse import unquote_plus
import boto3


bucket = 'testBucket1234'
# uploaded file with name 'foo + bar.txt' for test, s3 Put event passes following encoded object_key
object_key = 'foo %2B bar.txt'
print(object_key)
object_key = unquote_plus(object_key)
print(object_key)

client = boto3.client('s3')
client.get_object(Bucket=bucket, Key=object_key)

答案 2

NodeJS,Javascript或Typescript

由于我们正在为其他运行时共享,因此如何在NodeJS中执行此操作:

const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));

我会说这是一个官方解决方案,因为它来自这里的AWS文档