2016-12-19 2 views
0

Я попытался сохранить изображение в каталоге сервера и сохранить его путь в mongodb. Когда клиент (Angularjs) запрашивает данные, Express должен отправить массив объектов, в которых одно свойство объекта отправит изображение, а остальные свойства объекта - данные. Сначала я получил путь изображения от mongodb и прочитал изображение из каталога сервера и добавил его к остальным данным и отправил ответ. Но изображение отправляется как буферный массив, а моя страница html не может отображать массив буфера изображений.Показать изображение в виде ответа от Express с API Node.js до Angularjs

Вот код

Экспресс-код

var fs = require('fs'); 
//To view the cars 
app.route('/cars/view') 
    .get(function(req,res){ 

     rentalcars.find().toArray(function(err,docs){ 
      if(err){ 
       res.send([{found:false}]); 
      }else{ 
       var data = []; 
       data.push({found:true}); 
       for(var i=0;i<docs.length;i++){ 
        docs[i].imagePath = fs.readFileSync('./assets/images/'+docs[i].imagePath); 
        data.push(docs[i]); 
       } 

       res.send(data); 
      } 
     }); 
}); 

Код клиента

<table> 
    <tbody ng-repeat="car in home.cars"> 
    <tr> 
     <img ng-src="data:image/JPEG;base64,{{car.imagePath.data}}"> 
     <td>{{car.carName}}<br/>Segment : {{car.segment}}<br/>Rent : ${{car.rentCost}} /day</td> 
    </tr> 
    </tbody> 

</table> 

Ответ я получаю через вызов экспресс API, как показано ниже

[ 
    { 
    "found": true 
    }, 
    { 
    "_id": "58564aacbd224fdd2b7ad527", 
    "carName": "sai", 
    "segment": "suv", 
    "rentCost": "1000", 
    "imagePath": { 
     "type": "Buffer", 
     "data": [ 
     255, 
     216, 
     255,........] 
    } 
    } 
] 

где данные массива о f огромных данных, я не вставлял их полностью. Как отправить изображения из Express с помощью API Node.js для клиента.

Ниже приведен код, который сохраняет изображения в каталоге сервера и сохраняет его путь в mongodb.

var filepath =''; 
    var storage = multer.diskStorage({ //multers disk storage settings 
      destination: function (req, file, cb) { 
       cb(null, './assets/images/'); 
      }, 
      filename: function (req, file, cb) { 
       var datetimestamp = Date.now(); 
       filepath = file.fieldname + '-' + datetimestamp + '.' + file.originalname.split('.')[file.originalname.split('.').length -1]; 
       cb(null, filepath); 

      } 
     }); 

    var upload = multer({ //multer settings 
         storage: storage 
        }).single('file'); 

    //To add new cars 
    app.route('/cars/add') 
     .post(function(req,res){ 
     //upload images to server/assets/images/ 
     upload(req,res,function(err){ 
      if(err){ 
       res.json({error_code:1,err_desc:err}); 
      } 
      var doc = { 
       carName : req.body.carname, 
       segment : req.body.segment, 
       rentCost : req.body.rentcost, 
       imagePath : filepath 
      } 

      rentalcars.insert(doc,function(err,result){ 
       if(err){ 
        res.json({error_code:1,err_desc:err}); 
       }else{ 
        res.json({error_code:0,err_desc:null}); 
       } 
      }); 
     }); 

    }); 
+0

2 вещи: 1. Вы сохраняете все изображение в базе данных? 2. Если вы используете мангуст, можете ли вы показать мне модель? – CreasolDev

+0

1. Нет, я сохраняю только путь изображения в базе данных, и изображения сохраняются в каталоге на стороне сервера с помощью «multer». 2. Я не использую мангуст, я использую собственный драйвер mongodb. А также я отредактировал свой вопрос, где я вставил код, который показывает, как я сохраняю свои изображения на сервере, и это путь в mongodb. –

+0

Поскольку вы используете экспресс и вы сохраняете местоположение файла в базе данных, я рекомендуем сделать маршрут статическим и использовать 'ng-src' в Angularjs и исправить его как это (быстрее всего реализовать и обслуживать с наименьшей нагрузкой на сервер) Или 2: загрузить изображение в память и base64 закодировать его (я НЕ рекомендую этот вариант) – CreasolDev

ответ

1

Поскольку вы сохраняете изображения на диске, вы используете express и angular, я рекомендую использовать express.static служить изображения и использовать ng-src, чтобы загрузить их правильный путь.
Это самый быстрый способ реализовать и обслуживать с наименьшей нагрузкой на сервер.