Как получить размер файла/ключа в boto S3?
Должен быть простой способ получить размер файла (размер ключа), не перетягивая весь файл. Я вижу это в свойствах браузера AWS S3. И я думаю, что я могу получить его из заголовка "Content-length" запроса "HEAD". Но я не связываю точки о том, как это сделать с помощью boto. Если вы разместите ссылку на несколько более полных примеров, чем в стандартные документы boto.
РЕДАКТИРОВАТЬ: Итак, похоже, что это делает трюк (хотя, глядя на исходный код, я не совсем уверен.):
bk = conn.get_bucket('my_bucket_name')
ky = boto.s3.key.Key(bk)
ky.open_read() ## This sends a GET request.
print ky.size
Теперь я оставляю вопрос открытым для комментариев, более эффективных решений или указателей на примеры.
Ответы
Ответ 1
Это будет работать:
bk = conn.get_bucket('my_bucket_name')
key = bk.lookup('my_key_name')
print key.size
Метод поиска просто выполняет запрос HEAD в ведро для имени ключа, поэтому он возвращает все заголовки (включая длину содержимого) для ключа, но не передает никакого фактического содержимого ключа.
S3 tutoria я упоминаю это, но не очень четко, а не в этом точном контексте. Я добавлю раздел, чтобы облегчить его поиск.
Примечание: для каждой старой ссылки типа http://boto.cloudhackers.com/s3_tut.html
, которая возвращает 404, добавьте "/en/latest"
сразу после ".com"
: http://boto.cloudhackers.com/en/latest/s3_tut.html
. (Кто-то должен изучить mod_rewrite...)
Ответ 2
в boto3:
s3.head_object
также выполняет запрос HEAD для получения метаданных об объекте:
s3 = boto3.client('s3')
response = s3.head_object(Bucket='bucketname', Key='keyname')
size = response['ContentLength']
Ответ 3
в boto3
с использованием ресурса S3:
boto3.resource('s3').Bucket(bucketname).Object(keyname).content_length
head_object
клиента S3 вернул мне http 403 Forbidden
Ответ 4
Используя S3 Object
вы можете получить размер файла (он же объекта) в байтах. Это ресурс, представляющий объект Amazon S3.
Фактически вы можете получить все метаданные, связанные с объектом. Как размер объекта, язык содержимого, кодировка, last_modified и т.д.
import boto3
s3 = boto3.resource('s3')
object = s3.Object('bucket_name','key')
file_size = object.content_length //size in bytes
Ссылка boto3 doc