2013-06-19 111 views
2

我有一個用base 64編碼的圖像,我想將其存儲在我的數據存儲模型中。如何在GAE數據存儲中將base64圖像作爲文件存儲

class Surveys(db.Model): 
    name = db.StringProperty(required = True) 
    text = db.TextProperty(required = True) 
    image = db.BlobProperty() 
    created = db.DateTimeProperty(auto_now_add = True) 

如何將base64字符串轉換回我可以放入數據庫的文件?下面是我如何做一個普通的文件。

name = 'test' 
text = 'test' 
image = self.request.get('img') 
s = Surveys(name = name, text = text) 
s.image = db.Blob(image) 
s.put() 
+1

我不確定要理解。你有一個base64編碼的文件內容。你希望在數據存儲中以二進制形式存儲它(即:_unencoded_)? –

+0

是的,我希望它再次成爲一個jpeg文件,我可以提交給數據存儲 –

回答

4

您是否在尋找解碼base64數據的方法?

您不妨看看各種可用的base64 utilities與Python。例如,base64.b64decode

import base64 

binary_data = base64.b64decode(base64_encoded_string) 

假設JPEG文件被正確編碼爲base64,這將「反向」操作 - 返回到相同的原始文件的內容的字節的字符串。在這個過程中,所有文件的「元信息」都將丟失:只返回文件的內容。不是它的原始名稱,權限等等。

+0

這是否會再次將它變成jpeg? –

+0

謝謝!我不知道它只是通過解碼才成爲一個文件。這麼多要學習:) –

1

您可以將base64字符串直接存儲到數據存儲區,然後在運行時在需要發送JPEG字節時將其解碼。

或者做其他方式輪......我喜歡先解碼以base64存儲到數據存儲中,因爲它是更有效的字節,你只需要解碼前一次。

而且你不需要在這裏的「文件」的概念......你剛纔的圖像存儲爲字節,當您需要發送它作爲JPEG到瀏覽器,你只需要創建相應的HTTP報頭(例如內容-Type:image/jpeg)並在http正文中回顯/寫入字節。

+0

是的!這就是我將要做的。非常感謝。 –

1

要添加到其他任何東西(這是所有的好建議):考慮在模型中使用ndb(新數據庫)而不是db。如果您爲單個圖像檢索執行get_by_id(),則ndb將爲您處理memecache。這實際上會加快您頻繁訪問圖像的延遲時間。此外,如果它是一個頻繁訪問的圖像,除了類型之外,還應將緩存控制語句添加到您的響應頭。 HTH。 -stevep

self.response.headers['Content-Type'] = 'image/jpeg' 
self.response.headers['Cache-Control'] = 'public, max-age=315360000' 
+0

大輸入!感謝評論史蒂夫。 –