如何将base64编码的字符串上传到s3并访问python中的html文件中的url

时间:2014-03-29 10:48:20

标签: python amazon-s3 boto

我有一个base64字符串。此字符串是base64,相当于image。现在这个文件应该上传到S3,应该直接在浏览器或html文件中使用s3 url访问。 我尝试了几种方法,但未能在浏览器中打开图像,只是将其下载到我的盒子中。

方法1: 使用botoS3方法set_contents_from_string

方法2: 将base64转换为StringIO并使用set_contents_from_file

方法3: 将base64保存到临时文件,然后使用方法set_contents_from_file。

我使用的所有上述方法只是在浏览器中下载文件,他们没有将其识别为图像

3 个答案:

答案 0 :(得分:4)

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!)

BTW我发布这个是因为出于某种原因我无法让set_contents_from_file(file_obj)方法为我工作...感谢您发布您的答案,很高兴看到该方法适用于你。

答案 1 :(得分:1)

我的问题的答案是使用boto set_meta_data并将内容类型设置为&#39; image / jpeg&#39;。然后它符合我的目的。现在我可以使用公共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)

答案 2 :(得分:0)

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')