put_object в s3 boto3 выдает поврежденный файл - PullRequest
0 голосов
/ 21 октября 2018

У меня есть функция, которая получает видео с S3 и выполняет с ним некоторые операции (получение миниатюр и короткого видео из исходного файла).

Мне удалось скачать файл и выполнить операции.Но когда я пытаюсь загрузить его, он всегда дает мне поврежденный файл.Кто-нибудь знает причину?

Я использую Python 3.6 и boto3.

Мой код:

thumb_img = './frames/0/40.png' #img thumb path
save_img = 'thumb_img_' + video_name.split('.')[0] + '.png'
session.put_object(ACL='public-read',
                   Body=thumb_img,
                   Key='PATH/TO/SUBFOLDER/' + save_img,
                   Bucket= BUCKET_NAME  )

Кто-нибудь знает, почему файл поврежден?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Таким образом, проблема заключалась в том, что я пытался загрузить файл напрямую.put_object занимает bytes or seekable file-like object.Таким образом, решение было достигнуто с открытием файла и получением фактического тела файла.

Итак код:

   thumb_img = './frames/1/40.png' #img thumb path
    save_img = 'thumb_img_' + video_name.split('.')[0]+'.png'

    with open(thumb_img , 'rb') as fd:
        session.put_object(ACL='public-read',
                           Body=fd,
                           Key='PATH/TO/SUBFOLDER/' + save_img,
                           Bucket=BUCKET_NAME)

Спасибо за помощь ..

0 голосов
/ 21 октября 2018

Атрибут Body для вызова put_object принимает "байты или доступный для поиска объектоподобный объект" в качестве значений согласно документации , в то время как вы указываете имя файла.

Следующий код открывает файл и предоставляет вместо него дескриптор файла как тело:

thumb_img = './frames/0/40.png' # img thumb path
save_img = 'thumb_img_' + video_name.split('.')[0] + '.png'
with open(thumb_img, 'rb') as fd:
    session.put_object(ACL='public-read',
                       Body=fd,
                       Key='PATH/TO/SUBFOLDER/' + save_img,
                       Bucket=BUCKET_NAME)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...