ViS*_*ViS 14 java json amazon-s3 amazon-web-services aws-lambda
我有一个lamba函数将对象从桶'A'复制到桶'B',一切都运行正常,直到名为'New Text Document.txt'的对象在桶'A'中创建,json被构建在S3事件中,键为"键":"新建+文本+文档.txt".
空格被'+'取代.我知道这是一个已知的问题,通过网络搜索.但我不知道如何解决这个问题,传入的json本身有一个'+'和'+'实际上可以在文件名中.比如'New + Text Document.txt'.
所以我不能盲目地在我的lambda函数中用'''来'''.
由于此问题,当代码尝试在存储桶中查找文件时,无法找到它.
请建议.
小智 12
我遇到了这个寻找一个用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)
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我要做的是
java.net.URLDecoder.decode(b.getS3().getObject().getKey(), "UTF-8")
{
"Records": [
{
"s3": {
"object": {
"key": "New+Text+Document.txt"
}
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
因此,现在JSon值“ New + Text + Document.txt”已正确转换为New Text Document.txt。
这已经解决了我的问题,请建议这是否是非常正确的解决方案。是否有任何可能破坏我的实施的极端情况。
由于我们正在为其他运行时共享这里是如何在 NodeJS 中执行此操作:
const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
Run Code Online (Sandbox Code Playgroud)
我认为在Java中你应该使用:
getS3().getObject().getUrlDecodedKey()
Run Code Online (Sandbox Code Playgroud)
返回解码密钥的方法,而不是
getS3().getObject().getKey()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6137 次 |
| 最近记录: |