Хранение файла в postgres с помощью node-postgres

Я пытаюсь сохранить небольшой файл в БД postgres, используя модуль node-postgres. Я понимаю, что для этого я должен использовать тип данных bytea. Проблема у меня есть, когда я делаю что-то вроде:

fs.readFile path, (err, data) ->
    client.query 'UPDATE file_table SET file =  WHERE key = ', [data, key], (e, result) ->
    ....

содержимое столбца file в БД: x и ничего не хранится. Если я изменю буфер данных на hex, то есть данные.toString ('hex') файл сохраняется, но все форматирование теряется, когда я читаю файл обратно.

каков правильный способ хранение файла в postgres с помощью модуля node-postgres?

2 ответов


трюк состоит в том, чтобы закодировать как hex и добавить файл с \x. Чтение его обратно действительно поддерживается через parseByteA, который возвращает буфер:

https://github.com/brianc/node-postgres/blob/master/lib/textParsers.js

вот что я сделал, чтобы прочитать в образе с диска на postgres 9.2.2 и node.js 0.8.16 и node-postgres (пакет npm='pg') 0.11.2:

      fs.readFile(loc_on_disk, 'hex', function(err, imgData) {
        console.log('imgData',imgData);
        imgData = '\x' + imgData;
        app.pgClient.query('insert into image_table (image) values ()',
                           [imgData],
                           function(err, writeResult) {
          console.log('err',err,'pg writeResult',writeResult);
        });
      });

и что я сделал, чтобы написать ее обратно

app.get('/url/to/get/', function(req, res, next) {
  app.pgClient.query('select image from image_table limit 1',
                     function(err, readResult) {
    console.log('err',err,'pg readResult',readResult);
    fs.writeFile('/tmp/foo.jpg', readResult.rows[0].image);
    res.json(200, {success: true});
  });
});

Я предлагаю вам взглянуть, как SQLGrid

из readme:

  • эффективное - сохраните космос с автоматической встроенной дедупликацией.
  • легко - чтение и запись файлов, как если бы они были на диске с дружественными разработчику API.
  • изменения - сохраняет несколько версий файлов.
  • байт-диапазон способен - поддерживает диапазоны байтов для потоковой передачи сми.
  • последовательный - Sha256 хэши вычисляются при записи файла и проверяются при считывании обратно.
  • быстро - автоматически кэширует горячие данные, чтобы сохранить базу данных ненужных усилий.