在 MongoDB 中存储图像
你可以使用数据库将图片和其他微小图像存储在数据库表中。这样的图片文件可以在文件服务器上更有效地处理。
但是,当图像数据存储在二进制字段中时,只有将原始图片数据流式传输到该字段和从该字段流出的应用程序才能访问它。
MongoDB GridFS 规范是在 MongoDB 中存储相当大的文件的可行选择。它确保文件被分解为可管理的位并保存在数据库中。
本文解释了在 MongoDB 中保存和检索二进制文件的过程。
MongoDB 中的 GridFS
GridFS 是用于存储和检索比 BSON 设置的 16 MB 限制更大的文件的标准。GridFS 将文件拆分为部分或块,并将每个部分分开,而不是将其存储为单个文档。
在 Couchbase 中为每个项目存储一个元数据 JSON 文档,以及最多一个小缩略图。
该文档包含有关应用程序中该对象的信息,你需要这些信息并参考专门构建的对象存储,例如 S3、文件系统或 HDFS。因此,你将拥有两全其美。
在这个 MongoDB 教程中,详细讨论了在 MongoDB 数据库中存储图像的问题。此外,你还将了解保存图像和有效地从 MongoDB 数据库中检索图像的不同方法。
在 MongoDB 中使用 GridFS 存储图像
你可以通过使用 Mongoose 创建模式将图像存储在 MongoDB 数据库中。模式是通过创建文件 model.js
来定义的。
数据类型 Buffer
用于以数组的数据库形式存储图像。
图像的存储方式有以下三种:
- GridFS:使用 GridFS API,你将能够存储大尺寸图像。此 API 可帮助你将大文件存储为小块 (255KiB) 并将其存储到
"fs.chunks"
集合中的单独文档中。 - 内联:在这种情况下,较小的图像(16MB)可以使用二进制数据存储到 MongoDB 文档中。
- 参考:这里只将图片参考存储在数据库中,你也可以将图片存储在 API 或某些文件系统中。
由于最终用户难以访问大文件,因此将二进制文件存储在数据库中可以更轻松地在众多站点之间分发。值得注意的是,在将照片保存到数据库之前,你应该考虑其好处。
在 MongoDB 中使用 Python 存储图像
本节将讨论如何通过 Python 在 MongoDB 中存储图像。
你可以为此使用两个库:
-
GridFS
它是一个文件系统,用于存储和检索大量数据,例如照片、音频和电影。在这种情况下,将数据存储在 MongoDB 集合中存在偏差。
此外,它可以存储大于 16MB 规模限制的文件。
-
PyMongo
Python 库 PyMongo 与 MongoDB 数据库连接。可以使用各种功能操作,例如检索结果、写入和删除数据以及运行数据库。
如果你没有安装 PyMongo 库,你可以使用以下命令进行安装:
pip3 install pymongo
你现在可以在安装该库后使用它。但是,首先,导入库,连接到服务器以在 Python 中使用 MongoDB,并建立一个数据库来存储照片。
from pymongo import MongoClient
connection = MongoClient("localhost", 27017)
database = connection['DB_NAME']
MongoDB 默认在端口 27017 上运行。你可以在 DB_NAME
中为数据库指定任何名称。
GridFS 库在以下阶段将照片存储在 MongoDB 数据库中。
import gridfs
#Create an object of GridFs for the above database.
fs = gridfs.GridFS(database)
#Define an image object with the location.
file = "C:/Users/user/Pictures/dog.jpeg"
with open(file, 'rb') as f:
contents = f.read()
fs.put(contents, filename="file")
上述代码展示了如何使用 Python 将照片保存在 MongoDB 数据库中。
输出:
- 在输出右侧可以看到我们成功构建了数据库图片。
- 数据库有两个子文件夹,分别标记为
fs.chunks
和fs.files
。 - 图片以
ObjectID(('612727d8e71b2de49ac00734'),
保存在fs.files
文件夹中,你可以在其中查看所有图片详细信息,例如_id、文件名、md5、块大小、长度和上传日期。