簡體   English   中英

正確處理 Boto3 中的轉義字符

[英]Properly handling Escape Characters in Boto3

我有一個 S3 Bucket Streaming 日志到 lambda function,它根據一些邏輯標記文件。

雖然我過去曾解決過這個問題並且我知道有一些字符需要處理,但我想知道是否有一種安全的方法來處理這個問題 API 還是我需要自己處理。

例如我有一個 lambda function 像這樣:

import boto3

def lambda_handler(event, context):
    s3 = boto3.client("s3")

    for record in event["Records"]:
        bucket = record["s3"]["bucket"]["name"]
        objectName = record["s3"]["object"]["key"]

        tags = []
        
        if "Pizza" in objectName:
            tags.append({"Key" : "Project", "Value" : "Great"})
        if "Hamburger" in objectName:
            tags.append({"Key" : "Project", "Value" : "Good"})
        if "Liver" in objectName:
            tags.append({"Key" : "Project", "Value" : "Yuck"})

        s3.put_object_tagging(
            Bucket=bucket,
            Key=objectName,
            Tagging={
                "TagSet" : tags
            }
        )

    
    return {
        'statusCode': 200,
    }

這段代碼效果很好。 我將一個名為Pizza-Is-Better-Than-Liver.txt的文件上傳到 s3,然后 function 運行並用GreatYuck標記該文件(對於緊張的示例感到抱歉)。

但是,如果我上傳文件Pizza Is+AmazeBalls.txt東西 go 橫向:

查看 CloudWatch 中的事件,object 密鑰顯示為: Pizza+Is%2BAmazeBalls.txt

顯然,當我將該鍵傳遞給put_object_tagging()時,空間被轉義為++轉義為%2B ,它因NoSuchKey錯誤而失敗。

我的問題; 是否有定義的方法來處理 boto3 或其他一些 sdk 中的轉義字符,或者我只需要自己做? 我真的不知道並向 function 添加任何模塊,我可以只使用 do a contains / replace(),但奇怪的是我會得到一些東西,如果不進行一些轉換我無法立即使用。

我沒有上傳文件,也不能強制執行他們所說的東西(我試過但失敗了),如果它是有效的 Windows 或 Mac 文件名,它應該可以工作(我知道那是另一個問題但我可以處理)。

由於沒有其他答案,我想我張貼了我的創可貼:

def format_path(path):
    path = path.replace("+", " ")
    path = path.replace("%21", "!")
    path = path.replace("%24", "$")
    path = path.replace("%26", "&")
    path = path.replace("%27", "'")
    path = path.replace("%28", "(")
    path = path.replace("%29", ")")
    path = path.replace("%2B", "+")
    path = path.replace("%40", "@")
    path = path.replace("%3A", ":")
    path = path.replace("%3B", ";")
    path = path.replace("%2C", ",")
    path = path.replace("%3D", "=")
    path = path.replace("%3F", "?")
    return path

我確信有一種更簡單、更完整的方法可以做到這一點,但這似乎有效……目前。

暫無
暫無

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

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