我正在尝试使用 Multer 和 mongoose 存储图像 data:Buffer
I am trying to store images using Multer and mongoose though data:Buffer
我的架构看起来像这样
const RecipeSchema = mongoose.Schema({
user: [
{
userName: { type: String, required: true },
userID: { type: String, required: true },
userPicture: { data: Buffer, type: String, required: true }
}
],
recipeName: {
type: String,
required: true
},
created: {
type: Date,
required: true
},
ingredient: {
type: String,
required: true
},
rating: {
type: String
},
steps: [
{
step: { type: String },
picture: { type: String }
}
],
comments: [
{
comment: { type: String },
reply: { type: String }
}
],
pictures: [
{
picture: { data: Buffer, type: String, required: true }
}
]
})
let Recipe = (module.exports = mongoose.model('Recipe', RecipeSchema))
我的 post 方法和 multer 的设置如下所示。
const multer = require('multer')
const storage = multer.diskStorage({
destination: './route/uploads',
filename: function(req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
}
})
const upload = multer({
storage: storage,
limits: { fileSize: 1000000 },
fileFilter: function(req, file, cb) {
checkFileType(file, cb)
}
})
function checkFileType(file, cb) {
const filetypes = /jpeg|jpg|png|gif/
const extname = filetypes.test(path.extname(file.originalname).toLowerCase())
const mimetype = filetypes.test(file.mimetype)
if (mimetype && extname) {
return cb(null, true)
} else {
cb('Error: Images Only!')
}
}
router.post('/', upload.array('files', 10), (req, res) => {
let files = req.files
var recipe = new Recipe()
for (const key in files) {
if (files.hasOwnProperty(key)) {
console.log(files[key].path)
const fl = fs.readFileSync(files[key].path)
recipe.pictures.picture.data = fl
recipe.pictures.picture.type = 'image/png' // or 'image/png'
}
}
recipe.save()
})
我收到了这个错误
TypeError: Cannot set property 'data' of undefined
即使图片已保存,当我试图将路径保存到缓冲区时,它也不允许。在猫鼬上,文档现在不清楚如何启动缓冲区。
不要将图像(或文件)保存到数据库,只保存图像名称。
修补程序,但不推荐。
pictures
是一个数组。
for (const key in files) {
if (files.hasOwnProperty(key)) {
console.log(files[key].path)
const fl = fs.readFileSync(files[key].path)
recipe.pictures.push({
picture: {
data: fl,
type: 'image/png'
}
})
}
}
我的架构看起来像这样
const RecipeSchema = mongoose.Schema({
user: [
{
userName: { type: String, required: true },
userID: { type: String, required: true },
userPicture: { data: Buffer, type: String, required: true }
}
],
recipeName: {
type: String,
required: true
},
created: {
type: Date,
required: true
},
ingredient: {
type: String,
required: true
},
rating: {
type: String
},
steps: [
{
step: { type: String },
picture: { type: String }
}
],
comments: [
{
comment: { type: String },
reply: { type: String }
}
],
pictures: [
{
picture: { data: Buffer, type: String, required: true }
}
]
})
let Recipe = (module.exports = mongoose.model('Recipe', RecipeSchema))
我的 post 方法和 multer 的设置如下所示。
const multer = require('multer')
const storage = multer.diskStorage({
destination: './route/uploads',
filename: function(req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
}
})
const upload = multer({
storage: storage,
limits: { fileSize: 1000000 },
fileFilter: function(req, file, cb) {
checkFileType(file, cb)
}
})
function checkFileType(file, cb) {
const filetypes = /jpeg|jpg|png|gif/
const extname = filetypes.test(path.extname(file.originalname).toLowerCase())
const mimetype = filetypes.test(file.mimetype)
if (mimetype && extname) {
return cb(null, true)
} else {
cb('Error: Images Only!')
}
}
router.post('/', upload.array('files', 10), (req, res) => {
let files = req.files
var recipe = new Recipe()
for (const key in files) {
if (files.hasOwnProperty(key)) {
console.log(files[key].path)
const fl = fs.readFileSync(files[key].path)
recipe.pictures.picture.data = fl
recipe.pictures.picture.type = 'image/png' // or 'image/png'
}
}
recipe.save()
})
我收到了这个错误
TypeError: Cannot set property 'data' of undefined
即使图片已保存,当我试图将路径保存到缓冲区时,它也不允许。在猫鼬上,文档现在不清楚如何启动缓冲区。
不要将图像(或文件)保存到数据库,只保存图像名称。
修补程序,但不推荐。
pictures
是一个数组。
for (const key in files) {
if (files.hasOwnProperty(key)) {
console.log(files[key].path)
const fl = fs.readFileSync(files[key].path)
recipe.pictures.push({
picture: {
data: fl,
type: 'image/png'
}
})
}
}