Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js MongoDB&;Multer-如何将缓冲区二进制文件转换为图像?_Node.js_Mongodb_Mongoose_Multer - Fatal编程技术网

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

Node.js MongoDB&;Multer-如何将缓冲区二进制文件转换为图像?,node.js,mongodb,mongoose,multer,Node.js,Mongodb,Mongoose,Multer,我正在尝试建立一个简单的网站,在那里我可以上传一个图片到MongoDB并返回它。一切都很顺利,直到我回到返回图像部分 现在,我可以使用multer将图像上传到网站,当我将图像上传到数据库时,它会转换成二进制数据。谁能告诉我如何将二进制数据转换成图像?非常感谢 模式和模型 const mongoose = require('mongoose'); const fileStorageOneSchema = mongoose.Schema({ img: { data: Buf

我正在尝试建立一个简单的网站,在那里我可以上传一个图片到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))
    }
})
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)
        }
    })
})

快速上传到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')
                }
            })
        }
    })
})
快速返回图像

const fileStorageOne = multer.diskStorage({
    destination: './uploads/fileOne/',
    filename: (req,file,cb)=> {
        cb(null, file.fieldname + ' - ' + Date.now() + path.extname(file.originalname))
    }
})
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);
    }
  });
});
在这里,我使用它还可以从文件扩展名中查找正确的mime类型,但您也可以使用
.header('Content-type',data.img.contentType)

我还省略了
newbuffer()
调用,因为它已经是
缓冲区了

另外,假设您使用的是
multer
DiskStorage
,则不需要使用
path.join()构造路径
req.file.filename
,因为完整路径可以从
req.file.path
中找到。您还可以使用
req.file.mimetype
为非PNG图像获取正确的内容类型