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)
測試
大聖歸來
超棒的電影有木有 祝國產動漫越來越好
圖片服務器http://tblogpic.sinaapp.com 她很脆弱 請手下留情
End
至此整個圖片服務器開發完畢,整體來說還是相對簡單的,如果需要承受額外的高PV那就另當別論了,如果這個博客發展的好,圖片服務要求相對較高,那就是另一個層面的問題了。源碼就不發了,就是對file upload gae-python的改動,所有更改已經在上面介紹。至於如何部署到sae,在sae python 指南中都有介紹。
如果確實需要的話,歡迎直接聯繫我本人,謝謝。