![](/img/trans.png)
[英]Upload a base64 string(Image Data) to S3 server in Python using Boto3 and get URL in return
[英]How to upload a base64 encoded string to s3 and access the url in html file in python
我有一个 base64 字符串。 此字符串是 base64 等效于图像。 现在这个文件应该上传到 S3 并且应该直接在我的浏览器或 html 文件中使用 s3 url 访问。 我尝试了几种方法,但无法在浏览器中打开图像,它只是下载到我的盒子中。
方法一:使用botoS3方法set_contents_from_string
方法二:将base64转为StringIO,使用set_contents_from_file
方法 3:将 base64 保存到临时文件,然后使用 set_contents_from_file 方法。
我使用的所有上述方法只是在浏览器中下载文件,他们无法将其识别为图像
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)
方法为我工作……不过感谢您发布您的答案,很高兴看到该方法对您set_contents_from_file(file_obj)
。
from boto.s3.connection import S3Connection
from boto.s3.key import Key
import base64
picture = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlcAAAMfCAY...example"
conn = S3Connection('ACCESS', 'SECRET', host='HOST')
bucket = conn.get_bucket('BUCKET')
k = Key(bucket)
k.key = 'filename.png'
picture = picture.replace("data:image/png;base64,","")
k.set_contents_from_string(base64.b64decode(picture))
k.set_metadata('Content-Type', 'image/png')
我的问题的答案是使用 boto set_meta_data 并将内容类型设置为“image/jpeg”。 然后它达到了我的目的。 现在我可以使用公共网址在浏览器中打开图像
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.