`
hereson
  • 浏览: 1427792 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

在GAE数据库之中保存文件

 
阅读更多

       GAE的数据库是支持向里面保存文件的(说老实话,就算不支持,通过对二进制转化为文本肯定也是可以保存的),这个功能我知道,不过我的用不着,因为我的网站文件并不多,数据库却大的不行,我一直在苦恼如何去节省数据库空间,而从来不去想如何节省文件空间,可是有一个网友一定要我研究一下(主要是有些人比较懒,不想研究,唉!),我只好简单的进行了一下研究,还好,还是比较容易的,现在将主要的流程讲一下。

        首先当然是怎么向数据库之中存文件,我仅仅研究了通过本地向远程数据库上传静态文件的模式,想来,通过服务器创建二进制文件并保存也没有什么不同。我使用python脚本实现了一个方便的工具,一旦运行这个脚本,就会将该脚本所在位置uploadFiles文件夹下面的内容上传到GAE的数据库之中,下面是该脚本的源码,那是相当的简单啊:

 


# -*- coding: utf-8 -*- #   
import code
import getpass
import sys
import os

sys.path.append(
"D:\Program Files\Google\google_appengine\lib\yaml\lib")
sys.path.append(
"D:\Program Files\Google\google_appengine")

from google.appengine.ext.remote_api import remote_api_stub
from google.appengine.ext import db
#数据格式定义
class FileData(db.Model):
    category 
= db.CategoryProperty(required=True)
    uploadTime 
= db.DateTimeProperty(auto_now= True )
    path 
= db.StringProperty(required=True)
    content 
= db.BlobProperty(required=True)
#如果你将你的用户名和密码写在这个函数里面,就不用每次输入用户名和密码了
def auth_func():
    
return raw_input('Username:'), getpass.getpass('Password:')

def walkdir(dirname):
    ls
=os.listdir(dirname)
    
for l in ls:
        path
=os.path.join(dirname,l)        
        
if(os.path.isdir(path)):
            walkdir(path)
        
else:
            f
=open(path,"rb")
            content
=f.read()
            f.close()
            item
=FileData(category='Test',path=path.replace("\\","/").replace(rootPath,""),content=content)
            db.put(item)
#配置要上传的文件夹路径
rootPath="./uploadFiles"
#下面一句配置连接remote_api的路径,至于怎么部署remote_api,看GAE文档和我以前的文章
remote_api_stub.ConfigureRemoteDatastore("yourappid"'/remote_api',auth_func)
#遍历文件夹
walkdir(rootPath)
print "OK"

 

        因为我无意于使用该功能,所以上面的脚本做的很简单,具体的使用可以自己扩充更改,脚本只需要配置上传文件夹路径、appid、remote_api路径三项就应该可以运行了。

        上传成功之后,可以在GAE后台看到数据,对于content字段,在GAE后台显示为类似"156240 bytes, SHA-1 = 1d616cd4cd0de8e26f350143e29b3cc63e156825"的描述文本。

        下面的问题是如何调用和返回这个内容,这更加容易了,我是采用以下方式来返回此文件的:

 

result=FileData.all().filter("path = ",path).fetch(1)
if len(result)>0:
    self.response.out.write(result[0].content)
else:
    self.response.set_status(
404)

 

        很轻松容易吧,事实上就是这么简单的,有些网友不怎么喜欢研究,这一点要好好批评一下!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics