从我的研究到目前为止,我有几个选择,如:
>像MongoDB,GridFS这样的Nosql解决方案
>将文件存储在目录层次结构中的文件系统中,然后使用Web服务器通过URL访问图像
> Apache Jackrabbit文档存储库
>存储在Memcache,Squid Proxy等缓存中
你想选择哪一个以及为什么会有用的想法或有更好的方法吗?
解决方法
根据我迄今为止的经验,GridFS的主要优点是它不需要单独的文件存储系统.我们的整个持久层已经放入Mongo,因此下一个合乎逻辑的步骤是将文件系统存储在那里.平面命名空间只是摇滚,允许您使用丰富的查询语言根据要附加到它们的任何元数据来获取文件.在我们的应用程序中,我们使用了一个嵌入所有所有权信息的’appdata’对象,确保
Nosql文件存储,尤其是GridFS,需要考虑的另一件事是它将与其他数据一起进行分片和扩展.如果你已经将整个数据库键值存储放在mongo服务器中,那么最终如果你需要用更多的机器扩展服务器集群,你的文件系统就会随之增长.
它可以感觉到一个小“黑盒子”,因为二进制数据本身被分成块,这个前景吓坏了那些习惯于基于经典目录的文件系统.在RockMongo等管理程序的帮助下,这一点得到了缓解.
总而言之,在GridFS中存储图像就像插入文档一样简单,所有主要语言的大多数驱动程序都可以为您处理所有内容.在我们的环境中,我们在端点上进行了图像上传,并使用PIL执行调整大小.然后从另一个只输出数据的端点从mongo获取图像,并将其模仿为jpeg.
祝你好运!
编辑:
为了举例说明使用GridFS上传一个简单的文件,这里是PyMongo中最简单的方法,python库.
from pymongo import Connection import gridfs binary_data = 'Hello,world!' db = Connection().test_db fs = gridfs.GridFS(db) #the filename kwarg sets the filename in the mongo doc,but you can pass anything in #and make custom key-values too. file_id = fs.put(binary_data,filename='helloworld.txt',anykey="foo") output = fs.get(file_id).read() print output >>>Hello,world!
如果您愿意,也可以查询自定义值,如果您希望查询基于与应用程序相关的自定义信息,这可能非常有用.
try: file = fs.get_last_version({'anykey':'foo'}) return file.read() catch gridfs.errors.NoFile: return None
这些只是一些简单的例子,很多其他语言(PHP,Ruby等)的驱动程序都有同源词.