mongoose 如何在mongodb中将图像保存为BLOB?

exdqitrt  于 2023-10-19  发布在  Go
关注(0)|答案(1)|浏览(162)

我已经完成了一个个人项目,其中用户可以注册自己和他们的个人资料图片得到保存到本地磁盘,使用multer,和图像url路径返回给用户。一切都在顺利进行。
在完成这个项目之后,我意识到在mongodb中将个人资料图片存储为BLOB似乎是一种更好的方法,因为图像本身很小,数据被放置在一个地方,而不是磁盘上的图像文件和mongodb中的图像URL。所以,我基本上是在尝试完成这个项目,然而,我对buffer、blob和base64这些术语有点不知所措。有人可以帮助解释这些之间的区别,我应该使用哪一个存储在mongodb的个人资料图片。另外,我将使用mongoose,因为它没有“blob”模式类型,所以我假设我需要使用“buffer”模式类型。
最后,你也可以告诉我如何将图像转换为blob或缓冲区,并将其转换回来,以便它可以用作img源。我需要使用Multer吗?

7kqas0il

7kqas0il1#

我会尽量保持简短,因为网上有大量关于这些主题的材料。一开始感到不知所措是可以的,但说实话,最终让你的头绕过去既不困难也不耗时。
Base64是一种编码方法,它将数据转换为一组特殊的1和0。缓冲区是一个指定的内存区域,用于存储处理器访问和处理的二进制数据。Blob(二进制大对象)是一种数据类型,通常用于数据库中存储二进制数据。
由于Mongoose没有特定的blob模式类型,因此您可以使用buffer模式类型来存储二进制数据(如图像)。

const mongoose = require('mongoose')

const userSchema = new mongoose.Schema({
  username: String,
  profilePicture: Buffer // Store the profile picture as a buffer
})

const User = mongoose.model('User', userSchema)

module.exports = User

要在Node.js中将图像转换为缓冲区,您可以使用fs等模块读取图像文件,然后将其存储为缓冲区。

const fs = require('fs');

// Read the image file and store it as a buffer
const imageBuffer = fs.readFileSync('path/to/image.jpg')

要将缓冲区转换回可以在HTML img标记中显示的图像源,可以使用带有Base64编码的数据URI方案。

// Convert the buffer to a Base64-encoded data URI
const base64Image = imageBuffer.toString('base64')
const imageSrc = `data:image/jpeg;base64,${base64Image}`

// Now you can use `imageSrc` as the source in an <img> tag in your HTML

关于Multer的使用,在MongoDB中将图像存储为缓冲区并不是严格必要的。Multer通常用于处理从客户端上传的文件,并将它们作为单独的文件保存在服务器的本地磁盘上。如果您没有将图像作为文件存储在磁盘上,而是直接将其保存为数据库中的缓冲区,则可以跳过使用Multer进行此特定用例。但是,如果您有其他文件上传要求,Multer仍然是一个有用的工具。

相关问题