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)

測試

大聖歸來

超棒的電影有木有 祝國產動漫越來越好

圖片服務器http://tblogpic.sinaapp.com 她很脆弱 請手下留情
monkey king back

End

至此整個圖片服務器開發完畢,整體來說還是相對簡單的,如果需要承受額外的高PV那就另當別論了,如果這個博客發展的好,圖片服務要求相對較高,那就是另一個層面的問題了。源碼就不發了,就是對file upload gae-python的改動,所有更改已經在上面介紹。至於如何部署到sae,在sae python 指南中都有介紹。

如果確實需要的話,歡迎直接聯繫我本人,謝謝。

發佈了3 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章