MongoDB:存储的base64缓冲区数据和检索的base64不匹配

Posted

技术标签:

【中文标题】MongoDB:存储的base64缓冲区数据和检索的base64不匹配【英文标题】:MongoDB: stored base64 buffer data and retrieved base64 does not match 【发布时间】:2015-01-22 14:56:47 【问题描述】:

我正在使用 Mongoose 将小型 base64 编码图像(每个大约 100-200K)直接发布到 mongodb。在存储之前,我可以看到内容与从客户端发送的内容相同。但是查询base64字符串和进去的不一样?知道我错过了什么吗?

    // process the add image request
app.post('/addimage', function(req, res) 
    console.log("Addimage post....");
    var qry = '_email' : req.user.local.email, 'date' : req.body.date, 'subject' : req.body.subject ;
    Item.findOne(qry, function(err, item) 
         if (err) 
             console.log('Find images failed: ' + err);
             var resp = '"result" : "failed", "msg" : ' + err + ', "_req" : "addimage"';
             res.send(resp);
          else 
             if (item == null)  // item doesn't exist, create now
                 var item = new Item();
                 item._email = req.body._email;
                 item.date = req.body.date;
                 item.subject = req.body.subject;
             

             // add image
             var image = new Image();
             image.timestamp = req.body.timestamp;
             image.contentType = req.body.contentType;
             var imgBuf = new Buffer(req.body.image, 'base64');
             image.image = imgBuf;
             item.images.push(image);

             item.save(function(err, result) 
                 if (err) 
                     console.log('Find images failed: ' + err);
                     var resp = '"result" : "failed", "msg" : ' + err + ', "_req" : "addimage"';
                     res.send(resp);
                  else 
                     res.send('"result" : "ok", _req: "addimage"');
                     console.log("Image saved and responded to ...");
                 
             );
         
    );
);

存储在 req.body.image 中的数据字符串以“/9j/4AAQSkZJ ...”之类的开头,但从 mongo shell 我看到它不同。是导致这种情况的 Bindata 的子类型 0 吗?

> db.items.find(subject:"Science",'images.image':1)

“_id”:的ObjectId( “547382943fc884447a767d58”), “图像”:[ “图像”:BinData(0,“LwA5AGoALwA0AEEAQQBRAFMAawBaAEoAUgBnAEEAQgBBAFEAQQBBAEEAUQBBAEIAQQBBAEQALwA0AFEAQgBZAFIAWABoAHAAWgBnAEEAQQBUAFUAMABBAEsAZwBBAEEAQQBBAGcAQQBBAGcARQBTAEEAQQBN P>

架构:

var imageSchema = new mongoose.Schema(
    timestamp   : String,
    contentType : String,
    image       : Buffer,
,  strict: true );
imageSchema.index( timestamp: 1,  unique: true );

var itemSchema = new mongoose.Schema(
_email     : 
                type: String,
                required: true,
            ,
date       : 
                type: String,
                required: true,
            ,
subject    :    
                type: String,
                required: true,
            ,   
images     : [imageSchema],
,  strict: false );
itemSchema.index( _email: 1, date: 1, subject: 1,  unique: true );

Mongodb 版本 2.6.5,Mongoose 3.8.1,Node v0.11.6-pre

另外,在创建 Buffer 对象时尝试使用 'utf8' / 'ascii' / 'ucs2' 而不是 'base64'。

谢谢!

【问题讨论】:

没有人将图像保存在数据库中!!!您必须保存图片的网址 @kaxi1993,显然你只知道 MongDB,更具体地说是 GridFS。让您自己进行一次快速搜索和信息会话,以发现是的技术已经发展...... 【参考方案1】:

它是节点版本;(恢复到 0.10.33 解决了这个问题!

【讨论】:

以上是关于MongoDB:存储的base64缓冲区数据和检索的base64不匹配的主要内容,如果未能解决你的问题,请参考以下文章

显示存储为缓冲区的 MongoDB 图像

显示存储为缓冲区的 MongoDB 图像

无服务器快递无法检索 pdf 文件(base64 编码)

mongodb存储二进制数据

使用 Worklight 适配器从 derby 检索存储为 CLOB 的 base64 图像

使用 Thymeleaf 显示 Base64String 图像