1. 程式人生 > >Sae Storage使用——之圖片伺服器

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 指南中都有介紹。

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