Попытка получить все изображения из папки вне области server.js - PullRequest
0 голосов
/ 22 апреля 2019

Я работаю над тем, что будет встроенным веб-сайтом для аппаратного обеспечения с файловой структурой, где только определенные папки имеют доступ для чтения / записи. Мой server.js вместе с реализацией angularjs будет находиться в каталоге только для чтения, однако мне нужно отобразить изображения, которые будут храниться в отдельном каталоге, который будет иметь права на чтение / запись, так как конечный пользователь может добавлять изображения в папку .

Я знаю, что могу прочитать и отправить все файлы из NodeJS в AngularJS с этим кодом:

fs.readdir(fileDirectory, function(err,files){
  files.forEach(function(file){
    console.log('got file', file)
    fs.readFile(fileDirectory + file, function(err, buffer){
      var base64Image = new Buffer(buffer, 'binary').toString('base64');
      // res.send(base64Image);
      res.end(base64Image);
    })
  })
})

Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как заставить мой веб-интерфейс ждать всех ответов, поскольку вышеприведенное будет посылать по одному res на файл, но angularJS прекращает прослушивание res после первого появления.

Вот моя функция контроллера AngularJS:

  $scope.servericon = [];
  var iconarray = fmsFactory.getAllIcons().then(function(res){
    console.log('controller got', res);
    blob = b64toBlob(res.data, 'image/png')
    blobUrl = URL.createObjectURL(blob);
    img = document.createElement('img');
    img.src = blobUrl.slice(5, blobUrl.length)  //remove blob: from url
    $scope.servericon.push(img.src)
    // document.getElementByID('library').appendChild(img);
  });

и мой завод, который является просто базовым запросом

  factory.getAllIcons = function(callback){
    return $http({
      url: '/allIcons',
      method: 'GET'
    }).then(function(res){
      console.log('success', res);
      return res
    }, function(res){
      console.log('something went wrong', res);
    })
  }

Мои ожидаемые результаты будут массивом URL-адресов файлов, чтобы я мог выполнить ng-repeat для массива servericon и отобразить изображения с тегом img

1 Ответ

0 голосов
/ 22 апреля 2019

После того, как вы позвоните res.end(), ответ считается завершенным, и вы больше ничего не можете отправить.Вместо этого вы должны получать все данные изображения, объединяя их в один буфер.Это будет выглядеть примерно так:

let promises = [];
fs.readdir(fileDirectory, function(err,files){
  promises.push(new Promise((resolve, reject) => {
    files.forEach(function(file){
      console.log('got file', file)
      fs.readFile(fileDirectory + file, function(err, buffer){
        var base64Image = new Buffer(buffer, 'binary').toString('base64');
        resolve(base64Image);
      })
    })
  }))
})

Promise.all(promises).resolve(base64Image => {
  res.send(base64Image)
  res.send('\n::\n')  // choose any delimiter that you can split on
}).then(() => res.end())

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

Теперь на стороне клиента вам нужно будет захватить весь буфер, а затем разделить его, используя разделитель.Примерно так будет работать:

$scope.servericon = [];
var iconarray = fmsFactory.getAllIcons().then(function(res){
  console.log('controller got', res);
  res.data.split('\n::\n').forEach(blob => {
    blob = b64toBlob(res.data, 'image/png')
    blobUrl = URL.createObjectURL(blob);
    img = document.createElement('img');
    img.src = blobUrl.slice(5, blobUrl.length)  //remove blob: from url
    $scope.servericon.push(img.src)
    // document.getElementByID('library').appendChild(img);
  })
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...