【问题标题】:Properly handling Escape Characters in Boto3正确处理 Boto3 中的转义字符
【发布时间】:2023-02-17 05:43:31
【问题描述】:

我有一个 S3 Bucket Streaming 日志到 lambda 函数,该函数根据某些逻辑标记文件。

虽然我过去和I understand 解决过这个问题,但有一些字符需要处理,我想知道是否有一种安全的方法可以使用某些 API 来处理这个问题,或者我需要自己处理这个问题.

例如,我有一个像这样的 lambda 函数:

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,然后该函数运行并使用 GreatYuck 标记该文件(对于紧张的示例感到抱歉)。

但是,如果我上传文件Pizza Is+AmazeBalls.txt,事情就会发生变化:

查看 CloudWatch 中的事件,对象键显示为:Pizza+Is%2BAmazeBalls.txt

显然,当我将该密钥传递给put_object_tagging()时,空间被转义为++转义为%2B,它失败并出现NoSuchKey错误。

我的问题;是否有定义的方法来处理 boto3 或其他一些 sdk 中的转义字符,或者我只需要自己做?我真的不知道并向函数添加任何模块,我可以只使用 do a contains / replace(),但奇怪的是我会得到一些东西,如果不进行一些转换我无法立即使用。

我没有上传文件,也不能强制执行他们所说的东西(我试过但失败了),如果它是有效的 Windows 或 Mac 文件名,它应该可以工作(我知道那是另一个问题但我可以处理)。

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda


    【解决方案1】:

    编辑:

    因此,在 GitHub 上进行一些 cmet 之后,我应该在这种情况下使用 urllib.parse.unquote_plus。这将是解决此类转义问题的正确方法。

    from urllib.parse import unquote_plus
    print(unquote_plus("Pizza+Is%2BAmazeBalls.txt"))
    # Pizza Is+AmazeBalls.txt
    

    原答案:

    由于没有其他答案,我想我张贴了我的创可贴:

    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
    

    我确信有一种更简单、更完整的方法可以做到这一点,但这似乎有效……目前。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 2019-07-28
      相关资源
      最近更新 更多