我有一个lamba函数来从桶中复制对象' A'为了解决问题,所有事情都运转良好,直到和对象名称为' New Text Document.txt'它是在存储桶中创建的,它是在S3事件中构建的json,键为" key":" New + Text + Document.txt"。
这些空间被' +'取代。我知道这是一个已知的问题,通过网络搜索。 但我不知道如何解决这个问题,而传入的json本身就有一个' +'和' +'实际上可以是文件的名称。喜欢' New + Text Document.txt'。
所以我不能盲目地对空间进行逻辑思考+'通过' '在我的lambda函数中。
由于此问题,当代码尝试在存储桶中查找文件时,无法找到它。
请建议。
答案 0 :(得分:8)
我遇到了这个寻找用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)
答案 1 :(得分:7)
我已经采取了哪些措施来解决这个问题
java.net.URLDecoder.decode(b.getS3().getObject().getKey(), "UTF-8")
{
"Records": [
{
"s3": {
"object": {
"key": "New+Text+Document.txt"
}
}
}
]
}
所以现在JSon值“New + Text + Document.txt”正确地转换为New Text Document.txt。
这解决了我的问题,如果这是非常正确的解决方案,请建议。 会不会有任何可以破坏我的实施的角落案例。
答案 2 :(得分:1)
由于我们要与其他运行时共享,因此这里是如何在NodeJS中做到这一点:
const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
答案 3 :(得分:0)
我认为您应该使用:
getS3().getObject().getUrlDecodedKey()
返回解码密钥而不是
的方法getS3().getObject().getKey()
答案 4 :(得分:0)
同意斯科特。对我来说,创建对象事件是在分号后面附加%3:我必须替换两次以获取正确的s3网址
Python 代码:
def lambda_handler(event, context):
logger.info('Event: %s' % json.dumps(event))
source_bucket = event['Records'][0]['s3']['bucket']['name']
key_old = event['Records'][0]['s3']['object']['key']
key_new = key_old.replace('%3',':')
key = key_new.replace(':A',':')
logger.info('key value')
logger.info(key)
答案 5 :(得分:0)
具有UrlDecode。示例如下。
HttpUtility.UrlDecode(s3entity.Object.Key, Encoding.UTF8)