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