GAE的数据库是支持向里面保存文件的(说老实话,就算不支持,通过对二进制转化为文本肯定也是可以保存的),这个功能我知道,不过我的用不着,因为我的网站文件并不多,数据库却大的不行,我一直在苦恼如何去节省数据库空间,而从来不去想如何节省文件空间,可是有一个网友一定要我研究一下(主要是有些人比较懒,不想研究,唉!),我只好简单的进行了一下研究,还好,还是比较容易的,现在将主要的流程讲一下。
首先当然是怎么向数据库之中存文件,我仅仅研究了通过本地向远程数据库上传静态文件的模式,想来,通过服务器创建二进制文件并保存也没有什么不同。我使用python脚本实现了一个方便的工具,一旦运行这个脚本,就会将该脚本所在位置uploadFiles文件夹下面的内容上传到GAE的数据库之中,下面是该脚本的源码,那是相当的简单啊:

uploadFiles.py
# -*- 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)
很轻松容易吧,事实上就是这么简单的,有些网友不怎么喜欢研究,这一点要好好批评一下!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述