Как загрузить строку в кодировке base64 на s3 и получить доступ к URL-адресу в html-файле в python

У меня есть строка base64. Эта строка в base64 эквивалентна изображению. Теперь этот файл должен быть загружен на S3, и доступ к нему должен осуществляться с помощью URL-адреса s3 непосредственно в моем браузере или в html-файле. Я попробовал несколько способов, но не смог открыть изображение в браузере, оно просто загружается в мою коробку.

Способ 1: используйте метод botoS3 set_contents_from_string

Способ 2: преобразовать base64 в StringIO и использовать set_contents_from_file

Способ 3: сохраните base64 во временный файл, а затем используйте метод set_contents_from_file.

Все вышеперечисленные методы я использовал, просто загружая файл в свой браузер, они не распознают его как изображение.


person kishore    schedule 29.03.2014    source источник
comment
Вы пытались декодировать строку base64 в двоичный файл с помощью base64.decodestring или base64.b64decode link, затем set_contents_from_file? Вам нужно загрузить строку base64 вместо ее двоичного кода?   -  person emeth    schedule 29.03.2014


Ответы (2)


set_contents_from_string(base64.b64decode(data)) сработало для меня

Полный код

import boto
from boto.s3.connection import S3Connection
from boto.s3.key import Key
# import urllib
# from io import BytesIO
AWS_ACCESS_KEY = os.environ.get('AWS_ACCESS_KEY') 
AWS_SECRET_KEY = os.environ.get('AWS_SECRET_KEY')
AWS_BUCKET_NAME = os.environ.get('S3_BUCKET_NAME')
import base64

Я делаю это в представлении django, поэтому я читаю данные base64 и назначаю их переменной с именем cover_art в этот момент. Затем я сохраняю его на S3 следующим образом:

connection = boto.connect_s3()
bucket = connection.get_bucket(AWS_BUCKET_NAME)
cloudfile = Key(bucket)
path = "images/" + me.username + "/" + "cover-image-001.jpg"
cloudfile.key = path
cloudfile.set_contents_from_string(base64.b64decode(cover_art))
cloudfile.set_metadata('Content-Type', 'image/jpeg') # from https://stackoverflow.com/a/22730676 and https://stackoverflow.com/questions/16156062/using-amazon-s3-boto-library-how-can-i-get-the-url-of-a-saved-key
cloudfile.set_acl('public-read')

Дополнительный комментарий

Пару часов назад я был совершенно незнаком с кодировкой base64, поэтому даже не был уверен, с чем мне следует работать, используя boto. На тот случай, если вы вводите в boto не то, что нужно, вот дополнительное примечание к той переменной «cover_art», которую я использовал.

Скажем, данные выглядят так:

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFR...

Это то, что мне нужно поместить на веб-страницу, если, например, я хочу отобразить изображение, подобное этому

<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFR...">

Однако здесь, в коде Python, бит, который я передаю boto, без введения. Итак, моя переменная выглядит так:

cover_art = "/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFR..."

Я на самом деле собираю его из формы, которая выглядит как

<input name="cover_art" type="hidden" value="/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQV...">

(Если вы также используете форму и хотите проверить это в браузере при отправке, попробуйте получить форму с помощью javascript, а затем отобразить ее, что-то вроде alert(theForm.innerHTML))

Обратите внимание, здесь нет забавных персонажей, это НЕ похоже на ÿØÿà....

(Надеюсь, вы можете сказать по языку, который я использую, что я n00b!)

Кстати, я публикую это, потому что по какой-то причине я не смог заставить метод set_contents_from_file(file_obj) работать на меня ... спасибо за публикацию вашего ответа, приятно видеть, что этот метод сработал для вас.

person Mark    schedule 12.03.2015
comment
Вы можете быть нубом, но я нашел ваше подробное описание и код весьма полезным! Моя единственная критика заключается в том, что, особенно для примера кода, вам следует избегать использования однобуквенных имен переменных. Использование ключа, соединения и ведра вместо k, c и b значительно упростит анализ вашего примера. - person Nathan Hazzard; 05.04.2017
comment
@NathanHazzard спасибо за отзыв. Я избавляюсь от этой ужасной привычки однобуквенных имен переменных! Я обновил переменные, ранее называвшиеся «c», «b», «k», на «connection», «bucket» и «cloudfile» во фрагменте кода. Спасибо. - person Mark; 09.10.2017

Ответ на мой вопрос: используйте boto set_meta_data и установите тип контента «image/jpeg». Тогда это послужило моей цели. Теперь я могу открыть изображение в браузере, используя общедоступный URL-адрес.

conn = boto.connect_s3(AWS_ACCESS_KEYXXX, AWS_SECRET_KEYXXX)
bucket = conn.get_bucket(AWS_BUCKET_NAMEXXX)
k = Key(bucket)
k.key = s3_file_name
k.set_metadata('Content-Type', 'image/jpeg')
k.set_contents_from_file(file_obj)
person kishore    schedule 29.03.2014
comment
Можешь поделиться фрагментом? - person zengr; 06.03.2015
comment
@kishore Можете ли вы поделиться примером использования boto3? - person Sushant Pimple; 17.07.2018