Django项目 | 使用MongoDB存储图片

本文介绍了如何在Django项目中使用MongoDB的GridFS存储和检索图片。通过mongoengine库,创建数据模型,使用FileField存储图片,并详细解释了GridFS的工作原理,包括fs.files和fs.chunks集合。此外,还展示了如何从前端通过ajax获取base64格式的图片信息并展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近要做一个使用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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值