如何使用mongoose.js驱动程序和express.js保存和查询mongodb中的图像等二进制数据?

时间:2014-05-10 02:57:48

标签: javascript image node.js mongodb express

您好我的问题是如何保存和查询我的mongodb商店中的图像我知道嵌入字符串的基本方法,创建,更新和删除这个但当我尝试保存时

var UserSchema=new Schema({
    username:String,
    img:{ data: Buffer, contentType: String }
}); //UserSchema

var modelo=mongoose.model('reserv',UserSchema)//model DB

app.post('/upload',function(req,res){
    var img=req.files.imagen

    var imagen=new modelo ({
        username:'name',
        img:{
            data:fs.readFileSync(img.path),
            contentType:img.type,
        }   
    }).save(function(err,docs){
        if(err){
            console.log(err);
        }else{
            console.log('saved');
            res.redirect('/profile')
        }
    }); //return  img saved like binary format 'BJSON' [BSON][1] some thing iVBORw0KGgoAAAANSUhEUgAAB4AA.....

});

到目前为止这么好但是现在当intentento读取数据库翼二进制格式的图像存储时,这种格式变得几乎不可能构成它的巨大字符并且不知道如何解码它更易于在jade视图中服务或者是express.js的ejs模板引擎,如果有人知道如何解码或压缩将是一个很大的帮助:)

app.get('/profile',function(req,res){

    modelo.findOne({username:'que'},function(err,docs){
        if(err) return err;
        res.render('perfil',{info:docs.img.data})
    });

});

具体问题是我需要知道如何将二进制格式图像文件中的数据转换为服务或小网址。

1 个答案:

答案 0 :(得分:2)

您应该使用GridFS保存文件,然后为该文件设置单独的端点。在页面渲染上,您应该生成一个获取该文件的URL。

在上传时,我强烈建议stream从请求到数据库的文件目录,并在下载时直接返回到响应。

有一些modules可以帮助您解决此问题。 express-file-store看起来像是一个很好的实现。由于它支持多个后端,您可以根据配置进行更改(使用开发时的文件系统和生产中的gridfs,如果有任何机会决定更改后端,可以轻松将其更改为S3)。