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 她很脆弱 请手下留情

End

至此整个图片服务器开发完毕,整体来说还是相对简单的,如果需要承受额外的高PV那就另当别论了,如果这个博客发展的好,图片服务要求相对较高,那就是另一个层面的问题了。源码就不发了,就是对file upload gae-python的改动,所有更改已经在上面介绍。至于如何部署到sae,在sae python 指南中都有介绍。

如果确实需要的话,欢迎直接联系我本人,谢谢。

你可能感兴趣的:(SAE)