[英]AWS: how to fix S3 event replacing space with '+' sign in object key names in json
我有一個 Lamba 函數可以將對象從存儲桶“A”復制到存儲桶“B”,並且一切正常,直到在存儲桶“A”中創建了名稱為“New Text Document.txt”的對象,即構建的 json在 S3 事件中,key 為“key”:“New+Text+Document.txt”。
空格被替換為“+”。 我知道這是一個通過網絡搜索的已知問題。 但我不確定如何解決這個問題,傳入的 json 本身有一個“+”,而“+”實際上可以在文件名中。 像“新建+文本文檔.txt”。
所以我不能在我的 lambda 函數中盲目地將 '+' 與 ' ' 分隔開來。
由於這個問題,當代碼嘗試在存儲桶中查找文件時,它找不到它。
請建議。
我在尋找用 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)
我為解決這個問題所做的是
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。
這解決了我的問題,請建議這是否是非常正確的解決方案。 是否有任何極端情況會破壞我的實現。
我認為在 Java 中你應該使用:
getS3().getObject().getUrlDecodedKey()
返回解碼密鑰的方法,而不是
getS3().getObject().getKey()
在 ASP.Net 中有 UrlDecode。 示例如下。
HttpUtility.UrlDecode(s3entity.Object.Key, Encoding.UTF8)
同意斯科特。 對我來說,創建對象事件是為分號附加 %3 :我必須將其替換兩次才能獲得正確的 s3 url
蟒蛇代碼:
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)
我遇到了與特殊字符相同的問題,因為 aws S3 事件替換了 UrlEncoding 中的特殊字符。 所以為了解決同樣的問題,我使用了 aws decode API“SdkHttpUtils.urlDecode(String key)”來解碼對象鍵。 因此按預期工作。
您可以查看以下鏈接以獲取有關 SdkHttpUtils API 的更多詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.