AWS:如何使用' +'来修复S3事件替换空间在json

时间:2017-06-27 11:22:09

标签: java json amazon-web-services amazon-s3 aws-lambda

我有一个lamba函数来从桶中复制对象' A'为了解决问题,所有事情都运转良好,直到和对象名称为' New Text Document.txt'它是在存储桶中创建的,它是在S3事件中构建的json,键为" key":" New + Text + Document.txt"。

这些空间被' +'取代。我知道这是一个已知的问题,通过网络搜索。 但我不知道如何解决这个问题,而传入的json本身就有一个' +'和' +'实际上可以是文件的名称。喜欢' New + Text Document.txt'。

所以我不能盲目地对空间进行逻辑思考+'通过' '在我的lambda函数中。

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

请建议。

6 个答案:

答案 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, " "));

AWS docs here

答案 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)

ASP.Net中的

具有UrlDecode。示例如下。

HttpUtility.UrlDecode(s3entity.Object.Key, Encoding.UTF8)