2015-07-06 3 views
23

У меня есть экспресс-приложение, хранящее данные в mongo, используя Jade в качестве механизма просмотра. У меня есть простой маршрут, который получает документы в конкретной коллекции, каждый документ, соответствующий продукту. Изображение кодируется base64. Когда я пытаюсь и сделать как изображение, хотя он не работаетИспользование двоичных данных из коллекции Mongo в качестве источника изображения

Мой маршрут

exports.index = function(req, res){ 
    mongo.getProducts(function(data) { 
     res.render('consumer/index', {user: req.session.user, products: data}); 
    }); 
}; 

Функция, которая называет это

exports.getProducts = function(callback) { 

    Product.find().exec(function(err, products){ 
     return callback(products); 
    }); 
}; 

, а затем мой файл Джейд следующий код

each val in products 
    img(src="data:image/png;base64,'+#{val.image.data}+'", alt='Image', style="width: 20px; height: 20px") 

Глядя на документ непосредственно в Монго (через robomongo), я получаю это

enter image description here

enter image description here

Я не знаю, что я пропускаю, потому что в другом файле я использую JQuery DataTables, чтобы показать документы, и тот же подход, там правильно делает изображение, здесь фрагмент кода DataTables

"aoColumns": [ 
      {"mData": "name"}, 
      {"mData": "price"}, 
      {"mData": "category"}, 
      {"mData": "description"}, 
      {"mData": "image.data", "mRender": function (data, type, full) { 
      return '<img src="data:image/png;base64,'+data+'", style="width: 20px; height: 20px"></>'}}, 
      {"mData": "promoted"}, 
      {"mData": null} 
     ] 
+0

У вас есть попытка доступа к данным с использованием: val.image.data. $ Binary? – Tony

+0

Да, это просто говорит: «val.image.data. $ Binary' is' undefined' –

+0

вы можете отправить мне образец строки base64, который преобразован из буфера. Я не могу показать изображение. –

ответ

13

проблема в том, val.image.data не обеспечивает строку base64, но буфер. Итак, сначала вы должны преобразовать его. Это, как я сделал это работает:

Product.findById('559f6e08b090ca5c5ce6942b', function(err, result) { 
    if (err) throw (err); 

    var thumb = new Buffer(result.image.data).toString('base64'); 
    res.render('index', { title: 'Express', img: thumb}); 
}); 

Кроме того, есть небольшая проблема на вашем внешнем интерфейсе кода нефрита, он должен быть:

img(src="data:image/jpeg;base64,#{img}") //No + and ''

Примечание: Вы можете уйти с этим для малых эскизы или таковые, но это не рекомендуется по ряду причин (например, предел 16 МБ). Вы гораздо лучше используете GridFS. Дополнительная информация о http://docs.mongodb.org/manual/core/gridfs

+0

Привет, я пытаюсь сделать это в TypScript, но я не могу получить никакого результата. const imageString = Buffer.from (doc [9] .images [0] .toString()). ToString ("base64"); Это показывает строка: 77 + 977 + 977 + 977 + 9ABBKRklGAAEBAQBIAEgAAO +/ве +/vRPvv71FeGlmAABNTQAqAAAACAAOAQAAAwAAAAEP77 + 9W ++/vQEBAAMAAAABC++/vVvvv70BAgADAAAAAwAACO +/vQEOAAIAAAAEbWRlAAEPAA IAAAAHAAAI77 + 9ARAAAgAAAAgAAAjvv70BEgADAAAAAQABAAABMQACAAAAEAAACO +/vQEyAAIAAAAUAAAI77 + 9AhMAAwAAAAEAAS1B77 + 9aQAEAAAAAQAACO +/ве +/ве +/vQABAAAACAAAE ++/ве +/ве +/ vQABAAAACAAAE ++/ve +/vRwABwAACAwAAADvv70AAAAAHO +/vQAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAA –