Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将base64编码的字符串上载到s3并访问python中html文件中的url_Python_Amazon S3_Boto - Fatal编程技术网

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

如何将base64编码的字符串上载到s3并访问python中html文件中的url,python,amazon-s3,boto,Python,Amazon S3,Boto,我有一个base64字符串。此字符串的base64等效于图像。现在这个文件应该上传到S3,并且应该在我的浏览器或html文件中直接使用S3URL访问。 我尝试了几种方法,但未能在浏览器中打开图像,它只是下载到我的盒子中 方法1: 使用botoS3方法从字符串设置内容 方法2: 将base64转换为StringIO,并使用\u文件中的set\u contents\u 方法3: 将base64保存到temp文件,然后使用方法set_contents_from_file 我在浏览器中下载文件时使用的所

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

方法1: 使用botoS3方法从字符串设置内容

方法2: 将base64转换为StringIO,并使用\u文件中的set\u contents\u

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


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

我的问题的答案是使用boto设置元数据并将内容类型设置为“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)
为我工作

完整代码

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\u 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...
cover_art = "/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFR..."
这就是我需要放在网页上的东西,如果我想像这样显示图像的话

<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFR...">
我实际上是从一张表格上收集的

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

(如果您也在使用表单,并希望在提交时在浏览器中检查此项,请尝试使用javascript抓取表单,然后显示它,例如
alert(theForm.innerHTML)

注意,没有看起来很滑稽的字符,它看起来不像
Øÿa…

(希望你能从我使用的语言看出我是n00b!)


顺便说一句,我之所以发布这篇文章,是因为出于某种原因,我无法从文件(file\u obj)中获取对我有效的
set\u contents\u方法。。。感谢您发布您的答案,很高兴看到该方法对您有效。

您是否尝试使用base64.decodestring或base64.b64decode将base64字符串解码为二进制,然后从\u文件中设置\u内容?你必须上传base64字符串而不是它的二进制文件吗?你能分享这个片段吗?@kishore你能分享一个使用boto3的例子吗?你可能是一个noob,但我发现你的详细描述和代码非常有用!我唯一的批评是,尤其是在示例代码中,应该避免使用单字母变量名。使用key、connection和bucket而不是k、c和b将使您的示例更容易解析。@NathanHazzard感谢您的反馈。我正在摆脱单字母变量名的可怕习惯!我已经在代码片段中将以前称为“c”、“b”、“k”的变量更新为“connection”、“bucket”和“cloudfile”。非常感谢。
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')