簡體   English   中英

AWS:如何修復 S3 事件,在 json 中的對象鍵名中用“+”符號替換空格

[英]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。

這解決了我的問題,請建議這是否是非常正確的解決方案。 是否有任何極端情況會破壞我的實現。

NodeJS、Javascript 或 Typescript

由於我們正在為其他運行時共享這里是如何在 NodeJS 中執行此操作:

const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));

來自這里AWS 文檔

我認為在 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 的更多詳細信息。

https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/util/SdkHttpUtils.html#urlDecode-java.lang.String-

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM