Как отобразить несколько двоичного формата JSON в виде изображения, используя MongoDB и NodeJS? - PullRequest
0 голосов
/ 30 октября 2019

Я сохранил файлы в базе данных Mongo, используя Mongo Grid fs. MongoDB предоставляет отличную спецификацию GridFS, которая позволяет хранить файлы размером более 16 МБ непосредственно в базе данных в файлах и фрагментах.

GridFS использует две коллекции для хранения файловых данных. Имена по умолчанию: fs.files и fs.chunks.

Первая коллекция содержит метаданные файла, включая имя, размер, тип содержимого и т. Д. Во второй коллекции происходит волшебство. Коллекция fs.chunks содержит фактический файл, который был разбит на куски, размер по умолчанию 255 КБ.

Я получил файл, а затем куски. Нет проблем, когда я получаю только 1 файл, изображение завершено и не обрезано.

Но когда я кодирую код ниже, когда запрашиваю несколько файлов и кусков, а затем сохраняю его в locals.data.images_gallery, некоторые изображения обрезаютсяа некоторые не отображаются.

Есть проблемы с моей реализацией? Поскольку я делал запросы к каждому файлу один за другим, у них нет проблем, но когда я запрашиваю несколько файлов, другие обрезаются, а некоторые не отображаются.

На самом деле я выполняю двоичный формат JSON. Таким образом, чтобы отобразить это как изображение, я должен сделать дополнительный шаг преобразования данных в строки в кодировке base64

Моя логика при получении файлов (несколько файлов изображений):

MongoClient.connect(url, function(err, client) {

      if (err) {
        return res.render('index', {
          title: 'Uploaded Error',
          message: 'MongoClient Connection error',
          error: err.errMsg
        });
      }

      const db = client.db(dbName);
      const collection = db.collection('fs.files');
      const collectionChunks = db.collection('fs.chunks');


      collection.find({
          metadata: locals.data.vehicle.VIN
        }).toArray(function(err, docs) {
            if (err) {
              return res.render('index', {
                title: 'File error',
                message: 'Error finding file',
                error: err.errMsg
              });
            }
            if (!docs || docs.length === 0) {
              return res.render('index', {
                title: 'Download Error',
                message: 'No file found'
              });
            } else {


              for (let i = 0; i < docs.length; i++) {
                docs_ids.push(docs[i]._id)
              }

              collectionChunks.find({
                  files_id: {
                    $in: docs_ids
                  }
                })
                .toArray(function(err, chunks) {
                  if (err) {
                    return res.render('index', {
                      title: 'Download Error',
                      message: 'Error retrieving chunks',
                      error: err.errmsg
                    });
                  }
                  if (!chunks || chunks.length === 0) {
                    return res.render('index', {
                      title: 'Download Error',
                      message: 'No data found'
                    });
                  }


                  for (let i = 0; i < chunks.length; i++) {
                    locals.data.images_gallery.push('data:' + docs[0].contentType + ';base64,' +
                      chunks[i].data.toString('base64'));
                  }

                  return next();
                });


            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...