这是我的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.
我已经检查了存储桶,并且密钥实际存在
我错过了什么或者我在这里做错了吗?
答案 0 :(得分:4)
您的网址末尾有%0A;那是一个行分隔符。
答案 1 :(得分:3)
由于您知道您所拥有的密钥肯定是您要查找的文件的名称,因此我建议使用filter
来获取名称与您的密钥作为其前缀的对象。
s3 = boto3.resource('s3')
bucket = s3.Bucket('cypher-secondarybucket')
for obj in bucket.objects.filter(Prefix='MzA1MjY1NzkzX2QudHh0'):
print obj.key
运行此代码时,您将获得以密钥开头的所有文件的密钥名称。这将帮助您找出S3上确切调用的文件。
答案 2 :(得分:0)
我遇到的另一个可能的问题是,在我的对象的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'];
答案 3 :(得分:0)
from urllib.parse import unquote
key = "MzA1MjY1NzkzX2QudHh0%0A"
key = unquote(key)
这将从任何键中删除所有特殊字符。
答案 4 :(得分:0)
一个通用的答案可能对正在考虑文件路径的人有用,并且可能是AWS S3 terminology的新知识。没有正确使用“ 名称”和“ 键”通常会导致出现带有此问题中张贴的消息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}")