MongoDB & Multer - 如何将缓冲区二进制文件转换为图像?
MongoDB & Multer - How do I convert a buffer binary to an image?
我正在尝试制作一个简单的网站,我可以在其中将图像上传到 MongoDB 和 return。一切都很顺利,直到我到达 return 图片部分。
现在,我可以使用 multer 将图像上传到网站,当我将图像上传到数据库时,它会转换为二进制数据。谁能告诉我如何将二进制数据转换为图像?非常感谢!!
架构和模型
const mongoose = require('mongoose');
const fileStorageOneSchema = mongoose.Schema({
img: {
data: Buffer,
contentType: String
}
})
const fileStorageOne = mongoose.model("fileStorageOne", fileStorageOneSchema);
module.exports = fileStorageOne
多重存储
const fileStorageOne = multer.diskStorage({
destination: './uploads/fileOne/',
filename: (req,file,cb)=> {
cb(null, file.fieldname + ' - ' + Date.now() + path.extname(file.originalname))
}
})
快递上传到MongoDB
app.post('/upload_filestorageone', (req,res)=> {
uploadFileStorageOne(req, res, (err)=> {
if(err) {
console.log(err);
res.redirect('/')
} else {
const newImage = new fileStorageOneModel({
img: {
data: fs.readFileSync(path.join(__dirname + '/uploads/fileOne/' + req.file.filename)),
contentType: 'image/png'
}
})
newImage.save((err)=> {
if(err) {
console.log(err);
res.redirect('/')
} else {
console.log('Successfully uploaded a photo!');
res.redirect('/filestorageone')
}
})
}
})
})
表达Return图像
app.get('/filestorageone/:id', (req,res)=> {
fileStorageOneModel.findOne({}, (err,data)=> {
if(err) {
console.log(err)
} else {
const image = new Buffer(data.img.data).toString('base64')
return res.json(image)
}
})
})
EJS上传
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
</head>
<body>
<header>
<%- include('./partials/header') %>
</header>
<%- include('./partials/version') %>
<div class="submit-image-style">
<form action="upload_filestorageone" method="POST" enctype="multipart/form-data">
<input type="file" name="fileStorageOneImages">
<button type="submit">Submit</button>
</form>
</div>
<div class="output-style">
<% image.forEach((image)=> { %>
<a href="/filestorageone/<%= image._id %>"><%= image._id %></a>
<% }) %>
</div>
</body>
</html>
抱歉代码乱七八糟,它还是很新!
不要使用 .json()
方法发送图像,您需要设置适当的内容类型以便浏览器知道它是图像,然后 .send()
缓冲区:
app.get("/filestorageone/:id", (req, res) => {
fileStorageOneModel.findOne({}, (err, data) => {
if (err) {
console.log(err);
} else {
return res.type(data.img.contentType).send(data.img.data);
}
});
});
我在这里使用 .type()
,它也可以从文件扩展名中查找正确的 MIME 类型,但您也可以使用 .header('Content-Type', data.img.contentType)
.
我也省略了 new Buffer()
调用,因为它已经是 Buffer
。
附带说明一下,假设您使用的是 multer
和 DiskStorage
,则不需要使用 path.join()
和 req.file.filename
构建路径,因为可以从 req.file.path
找到完整路径。您还可以使用 req.file.mimetype
以便为非 PNG 图像获取正确的内容类型。
我正在尝试制作一个简单的网站,我可以在其中将图像上传到 MongoDB 和 return。一切都很顺利,直到我到达 return 图片部分。
现在,我可以使用 multer 将图像上传到网站,当我将图像上传到数据库时,它会转换为二进制数据。谁能告诉我如何将二进制数据转换为图像?非常感谢!!
架构和模型
const mongoose = require('mongoose');
const fileStorageOneSchema = mongoose.Schema({
img: {
data: Buffer,
contentType: String
}
})
const fileStorageOne = mongoose.model("fileStorageOne", fileStorageOneSchema);
module.exports = fileStorageOne
多重存储
const fileStorageOne = multer.diskStorage({
destination: './uploads/fileOne/',
filename: (req,file,cb)=> {
cb(null, file.fieldname + ' - ' + Date.now() + path.extname(file.originalname))
}
})
快递上传到MongoDB
app.post('/upload_filestorageone', (req,res)=> {
uploadFileStorageOne(req, res, (err)=> {
if(err) {
console.log(err);
res.redirect('/')
} else {
const newImage = new fileStorageOneModel({
img: {
data: fs.readFileSync(path.join(__dirname + '/uploads/fileOne/' + req.file.filename)),
contentType: 'image/png'
}
})
newImage.save((err)=> {
if(err) {
console.log(err);
res.redirect('/')
} else {
console.log('Successfully uploaded a photo!');
res.redirect('/filestorageone')
}
})
}
})
})
表达Return图像
app.get('/filestorageone/:id', (req,res)=> {
fileStorageOneModel.findOne({}, (err,data)=> {
if(err) {
console.log(err)
} else {
const image = new Buffer(data.img.data).toString('base64')
return res.json(image)
}
})
})
EJS上传
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
</head>
<body>
<header>
<%- include('./partials/header') %>
</header>
<%- include('./partials/version') %>
<div class="submit-image-style">
<form action="upload_filestorageone" method="POST" enctype="multipart/form-data">
<input type="file" name="fileStorageOneImages">
<button type="submit">Submit</button>
</form>
</div>
<div class="output-style">
<% image.forEach((image)=> { %>
<a href="/filestorageone/<%= image._id %>"><%= image._id %></a>
<% }) %>
</div>
</body>
</html>
抱歉代码乱七八糟,它还是很新!
不要使用 .json()
方法发送图像,您需要设置适当的内容类型以便浏览器知道它是图像,然后 .send()
缓冲区:
app.get("/filestorageone/:id", (req, res) => {
fileStorageOneModel.findOne({}, (err, data) => {
if (err) {
console.log(err);
} else {
return res.type(data.img.contentType).send(data.img.data);
}
});
});
我在这里使用 .type()
,它也可以从文件扩展名中查找正确的 MIME 类型,但您也可以使用 .header('Content-Type', data.img.contentType)
.
我也省略了 new Buffer()
调用,因为它已经是 Buffer
。
附带说明一下,假设您使用的是 multer
和 DiskStorage
,则不需要使用 path.join()
和 req.file.filename
构建路径,因为可以从 req.file.path
找到完整路径。您还可以使用 req.file.mimetype
以便为非 PNG 图像获取正确的内容类型。