AWS: как исправить событие S3, заменяющее пространство знаком "+" в именах ключевых слов объекта в json

У меня есть функция lamba для копирования объектов из bucket 'A' в bucket 'B', и все работает нормально, пока не будет создан объект с именем 'New Text Document.txt' в ковше 'A', json который строится в событии S3, ключ как "ключ": "Новый + Текст + Документ .txt".

пробелы заменены на "+" . Я знаю, что это известная проблема, серификация в Интернете. Но я не уверен, как это исправить, и входящий сам json имеет "+" и "+" , может быть на самом деле во имя файла. например "New + Text Document.txt".

Поэтому я не могу слепо иметь логику в пространстве '+' by '' в своей лямбда-функции.

Из-за этой проблемы, когда код пытается найти файл в ведре, он не находит его.

Просьба предложить.

Ответ 1

Что я сделал, чтобы исправить это,

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

Я наткнулся на это, ища решение для лямбда, написанного на python, вместо java; "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)

Ответ 3

Я думаю, что вы должны использовать:

getS3().getObject().getUrlDecodedKey()

метод, который возвращает декодированный ключ вместо

getS3().getObject().getKey()