簡體   English   中英

如何將base64編碼的字符串上傳到s3並在python中訪問html文件中的url

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM