【问题标题】:S3 giving me NoSuchKey error even when the key exists即使密钥存在,S3 也会给我 NoSuchKey 错误
【发布时间】:2022-01-21 19:41:42
【问题描述】:

这是我的 boto3 命令,用于从 S3 存储桶中获取具有特定键的对象:

resp = s3client.get_object(Bucket='<>-<>', Key='MzA1MjY1NzkzX2QudHh0')

它给出了以下错误:

botocore.errorfactory.NoSuchKey: An error occurred (NoSuchKey) when calling the GetObject operation: The specified key does not exist.

我已经在bucket中检查过,key确实存在

我是错过了什么还是我做错了什么?

【问题讨论】:

    标签: amazon-s3 boto3


    【解决方案1】:

    您的 URL 末尾有一个 %0A;那是行分隔符。

    【讨论】:

    【解决方案2】:

    由于您知道您拥有的密钥肯定在您要查找的文件的名称中,因此我建议使用filter 来获取名称以您的密钥作为前缀的对象。

    s3 = boto3.resource('s3')
    bucket = s3.Bucket('cypher-secondarybucket')
    for obj in bucket.objects.filter(Prefix='MzA1MjY1NzkzX2QudHh0'):
        print obj.key
    

    当您运行此代码时,您将获得以您的密钥开头的所有文件的密钥名称。这将帮助您了解您的文件在 S3 上的确切名称。

    【讨论】:

      【解决方案3】:

      一个通用的答案可能对那些正在考虑文件路径的人有用并且可能是AWS S3 terminology 的新手。没有正确获取“name”和“key”通常会导致出现异常,并出现此问题中发布的消息 An error occurred (NoSuchKey)...

      假设您有一个 JPEG 文件存储在存储桶的某个“路径”中。在 AWS 控制台上导航到此对象显示 S3 URI 为:

      s3://my-bucket/some/very/long/path/my-image.jpeg

      您可以通过这个基本示例在 Python 中读取 my-image.jpeg 对象:

      import boto3
      
      s3client = boto3.client('s3', region_name='us-east-1')
      
      bucket_name = 'my-bucket'
      object_key = 'some/very/long/path/my-image.jpeg'
      
      try:
          s3obj = s3client.get_object(Bucket=bucket_name, Key=object_key)
      except Exception as e:
          print(f"Error reading key {object_key} from bucket {bucket_name}: {e}")
      else:
         print(f"Got object: {s3obj}")
      

      【讨论】:

        【解决方案4】:

        我遇到的另一个可能的问题是,在我的 url 中导致一个对象的行分隔符是,在 AWS documentation 之一中,用于获取对象的键显示此代码作为示例来获取一个对象的键对象。

        foreach ($results as $result) {
            foreach ($result['Contents'] as $object) {
                echo $object['Key'] . PHP_EOL;
            }
        }
        

        问题是最后的PHP_EOL。只需将其删除,行分隔符就会消失。

        $object['Key'] . PHP_EOL; --> $object['Key'];

        【讨论】:

          【解决方案5】:
          from urllib.parse import unquote
          key = "MzA1MjY1NzkzX2QudHh0%0A"
          
          key = unquote(key)
          

          这将从任何键中删除所有特殊字符。

          【讨论】:

          • @techkuz 不需要导入 urlparse,编辑了我的答案
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-09
          • 2020-12-10
          • 2019-10-18
          • 1970-01-01
          • 1970-01-01
          • 2018-08-17
          相关资源
          最近更新 更多