最近要做一个使用mongodb做数据库的django项目,需要利用其存储图片。在django中使用mongoengine作为调用mongodb数据库的方法。探索了一下如何存放图片,记录在这里,但是肯定有更好的解决办法,希望有了解的人指点一下~
首先在晚上百度了一下,找到了很多办法,但是在试的过程中出现了很多问题,浪费了很多时间,最后还是在mongoengine官方文档找到了答案。
mongodb使用GridFS存储和检索大文件,如图片、音频文件、视频文件等。这是一种文件系统,用来存储文件,但数据存储于MongoDB的集合中。GridFS存储文件比其文档大小16MB限制的更大能力。GridFS
会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。
GridFS默认使用两个集合 fs.files 和 fs.chunks 存储该文件的元数据和块。每组块标识其唯一的_id
ObjectID字段。fs.files切断作为父文件。 fs.chunks 文档 files_id 字段链接块到其父文件。
在django中可以这样实现:
然后就照着官方文档来啦:
-
首先在models.py中创建数据模型
class UserInfor(mongoengine.Document):
userId = mongoengine.IntField(default=0)
img = mongoengine.FileField()
time = mongoengine.DateTimeField(default=datetime.datetime.now) -
然后可以在views.py中编写用于存放图片的方法。
imgtmp = open(’./static/goodsImage/cosmos.jpg’, ‘rb’)
temp = UserInfor(userId=userId)
temp.img.put(imgtmp, content_type=‘image/jpeg’)
temp.save()
其中存入图片需要采用put()的方式,这样就成功保存了。看一下效果:
首先在我们原数据库集合里里多出了刚刚存放的文档:
{
"_id": "5c1685fb10bf2143e8347174",
"userId": 0,
"img": "5c1685fb10bf2143e8347172",
"time": "2018-12-17T01:06:03.136Z"
}
其次数据库里多出了两个集合:
fs.files中的文档为:
{
"_id": "5c1685fb10bf2143e8347172",
"contentType": "image/jpeg",
"md5": "6492f052302b31167ff19c9dc72998df",
"chunkSize": 261120,
"length": 9569,
"uploadDate": "2018-12-16T17:06:03.146Z"
}
fs.chunks中的文档为:
{
"_id": "5c1685fb10bf2143e8347173",
"files_id": "5c1685fb10bf2143e8347172",
"n": 0,
"data": "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAA0JCgsKCA0LCgsODg0PEyAVExISEyccHhcgLikxMC4pLSwzOko+MzZGNywtQFdBRkxOUlNSMj5aYVpQYEpRUk//2wBDAQ4ODhMREyYVFSZPNS01T09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0//wAARCAEsAeEDASIAAhEBAxEB/8QAGwAAAgMBAQEAAAAAAAAAAAAAAAIBAwQFBgf/xAA3EAACAgECBQMDAgUDBAMBAAAAAQIRAwQhBRIxQVETYZEGUnEigRQyQqGxI4LBM1PR8BUWQ3L/xAAZAQEBAQEBAQAAAAAAAAAAAAAAAQIDBAX/xAAfEQEBAQEBAAMBAQEBAAAAAAAAARECIQMxQRJRImH/2gAMAwEAAhEDEQA/AMqxw+yPwSscPsj8DpAlufVx49R6cfsj8B6cPsj8D0FDIaT04fZH4J9OH2R+BkhqCbSenD7I/BPpwv8Akj8DAPDS8kPtXwg9OH2r4QxNA0npw+yPwMscH/TH4JSGSFCrHD7I/CBY4L+iPwh0gZEQowT/AJI/CG9OEl/JH4QJEpkCPHBf0R+EQscPsj8IuSTFap7BdJ6cPsj8Iza6EFp21BdfBsoza9JaWVi+Sk+3ISUZqSS+Dp6SePJGnGNr2RyoS5k0/wBi/S5HjzJ9jy251Oo7Zssdh44fZH4QPHB/0L4RKadU0NR6p764ewnpx+yPwg9OH2R+EPQJeShPTh9kfhAscPsj8IegoYuk9OH2x+EHpw+2PwiwgZE9IscF/RH4QenD7I/CHoKGGk9OH2x+EHpx+yPwh6Chgr9OP2R+ET6cPtj8IeiKGGk9OH2R+EHpw+2Pwh6CiYK3jh9kfhAscPsj8FgC4K/Tj9kfgPTh9kfhFhFDIE9OH2R+EHpwX9EfhDhQXVfpw+yPwQ8cL/kj8FtexDXgEqv04fZH4IeOC/oj8IsaZDXkvhpPTh9sfhA8cPsj8IeiKLkC+nD7Y/CI9OH2R+B6CgE9OH2R+CHjh9kfgsIJhqt44fYvgh44fZH4LGKxi6R44P8Aoj8CvHD7I/Ba0Q0Xw1U8cPsXwK8cPtXwWtEDFV8kfsXwA+wDBdRKRKRNUGUJUTRKQVuERRKQyRKiF0lAkW8oONBFaRKQ6VhQCqO41EpUiaJ9haChqCiBaCtxqBIAoEiaIbUU23SXUoJNRTbaSXVs5upzPU/6eNPlvd+Sc+WWqyckbUE/k04sCgulM4fJ8n3I68ce7XNz6SWKCmlsZ4byT6bno