MongoDB & Multer - 如何将缓冲区二进制文件转换为图像?

Posted

技术标签:

【中文标题】MongoDB & Multer - 如何将缓冲区二进制文件转换为图像?【英文标题】:MongoDB & Multer - How do I convert a buffer binary to an image? 【发布时间】:2021-07-09 00:18:51 【问题描述】:

我正在尝试制作一个简单的网站,我可以在其中将图像上传到 MongoDB 并返回。一切都很顺利,直到我返回图像部分。

现在,我可以使用 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')
                
            )
        
    )
)

快速返回图片

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>

抱歉代码乱七八糟,还是很新!

【问题讨论】:

【参考方案1】:

不要使用.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

附带说明,假设您使用的是multerDiskStorage,则不需要使用path.join()req.file.filename 构建路径,因为可以从@987654333 找到完整路径@。您也可以使用req.file.mimetype,这样您也可以为非 PNG 图像获得正确的内容类型。

【讨论】:

以上是关于MongoDB & Multer - 如何将缓冲区二进制文件转换为图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 multer 模块将图像上传到 mongodb

如何在nodejs中使用sharp调整图像大小然后使用multer上传

如何在nodejs中使用sharp调整图像大小然后使用multer上传

使用 Multer 将图像上传到 mongoDB 时 Heroku 出错

当我尝试在 MongoDB 数据库中上传图像时,出现 multer 错误

如何使用 multer 或 body-parser 上传文件