Sae Storage使用——之圖片伺服器
Intention
本文章是由我的部落格網站轉載過來,原稿地址t-blog
在建造這個部落格網站的過程中,需要儲存圖片的需求。而專案開始的時候,只能人為的將圖片UP到sae伺服器上,非常ugly 。同時,如果將圖片上傳整合到blog中,那麼程式程式碼將顯得臃腫,同時如果其它網站也需要這樣的業務時,還需要重新部署,所以決定單獨搭建一個圖片伺服器。
Prepare
- 開發語言: Python
- 雲服務: Sae Storage
本來當前在學習flask,但是查詢資料時,看到了Jquery File Upload,其中的Server版本中,就有一版Python-gae版本,此版本使用的是webapp2原始框架編寫的,為了減少程式碼的編寫,以及client端(js)程式碼的工作量,對這一版進行了改寫。
Build
file upload gae-python使用的是gae引擎,使用了google appengine api,同時sae是不允許進行原始的python檔案操作的,但是sae提供了更為方便的Storage幫助文件
為了進行改寫,我們需要更換程式碼中的關於檔案新增/刪除和Image操作的地方
process
初始化
首先新增必須的import
from sae.storage import Bucket
from StringIO import StringIO
from PIL import Image
之後進行bucket初始化(網上很多程式碼都是需要填寫access_key之類的資訊,當前sae在本應用程式碼使用時已經預設進行這些資訊的註冊
bucket_pic = Bucket('blog_pic')
bucket_pic.put()
bucket_pic.post(metadata={'expires': '5m'})
新增(上傳)圖片
上傳圖片時,需要儲存兩種格式,一種是原始圖片,另一種是縮小之後的thumbnail圖,在file upload gae-python中,使用的Image類是google appengine的,這裡我們使用PIL中的Image類(在sae中已經集成了PIL),具體程式碼如下:
write_blob(self, filedStorage, info):
'''
儲存圖片檔案到Storage中,原始圖片+thumbnail圖120*120
Params:
-fieldStorage form-data上傳檔案時的一個item
-info 當前檔案的一些資訊
注意: 這裡我們更改為了filedStorage而不是fieldStorage.value主要是,PIL Image
Open函式使用一個fd作為輸入
'''
data = filedStorage.value
key = urllib.quote(info['type'].encode('utf-8'), '') +\
'/' + str(hash(data)) +\
'/' + urllib.quote(info['name'].encode('utf-8'), '')
try:
bucket_pic.put_object(key, data) #儲存內容進入bucket
except:
return (None, None)
thumbnail_key = None
exp = None
if IMAGE_TYPES.match(info['type']):
try:
img = Image.open(filedStorage.file)
img.thumbnail((THUMB_MAX_WIDTH, THUMB_MAX_HEIGHT))
raw_card_output = StringIO()
img.save(raw_card_output, format=img.format)
thumbnail_data = raw_card_output.getvalue()
thumbnail_key = key + THUMB_SUFFIX
bucket_pic.put_object(thumbnail_key, thumbnail_data)
except Exception as e:
thumbnail_key = None
exp = str(e)
return (key, thumbnail_key, exp)
檢視(download)和刪除(delete)
檢視和刪除相對改動較簡單,只需要將其中關於memcache的操作,換成bucket的操作即可。
- download
data = bucket_pic.get_object_contents(key) #注意是get_object_contents不是get_object
- delete
bucket_pic.delete_object(key)
bucket_pic.delete_object(thumbnail_key)
測試
大聖歸來
超棒的電影有木有 祝國產動漫越來越好
End
至此整個圖片伺服器開發完畢,整體來說還是相對簡單的,如果需要承受額外的高PV那就另當別論了,如果這個部落格發展的好,圖片服務要求相對較高,那就是另一個層面的問題了。原始碼就不發了,就是對file upload gae-python的改動,所有更改已經在上面介紹。至於如何部署到sae,在sae python 指南中都有介紹。
如果確實需要的話,歡迎直接聯絡我本人,謝謝。