バケット「A」からバケット「B」にオブジェクトをコピーするlamba関数があります。「New Text Document.txt」という名前のオブジェクトが、ビルドされるjsonであるバケット「A」に作成されるまで、すべてが正常に機能していましたS3イベントでは、 "key"のキー: "New + Text + Document.txt"。
スペースは「+」に置き換えられました。私はそれがウェブで検索することによる既知の問題であることを知っています。しかし、これを修正する方法がわかりません。着信json自体に「+」があり、「+」は実際にはファイルの名前に含めることができます。 「New + Text Document.txt」のように。
したがって、ラムダ関数で盲目的に '+'を ''で区切るロジックを持つことはできません。
この問題が原因で、コードがバケット内のファイルを見つけようとすると、ファイルを見つけることができません。
提案してください。
これを修正するために私がしたことは
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に変換されます。
これで問題が解決しました。これが非常に正しい解決策であるかどうかを提案してください。私の実装を破壊する可能性のあるコーナーケースはありますか?.
python)で記述されたラムダの解決策を探してこれに遭遇しました; "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を追加していました:正しいs3 urlを取得するには2回置換する必要があります
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)
私はあなたが使うべきだと思います:
getS3().getObject().getUrlDecodedKey()
代わりに、デコードされたキーを返すメソッド
getS3().getObject().getKey()