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

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

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

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

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


person Clive    schedule 29.10.2012    source источник
comment
Здесь вам поможет изучить данные, которые вставляются в базу данных с помощью psql. Посмотри, правильно ли там. Это скажет вам, связана ли проблема с правильной вставкой данных или с их обратным чтением. Вам также необходимо указать вашу версию Pg; формат bytea по умолчанию изменен с escape на hex в 9.0.   -  person Craig Ringer    schedule 30.10.2012
comment
Какую node-postgres версию вы используете? Похоже, что примерно год назад он поддерживает bytea (github.com/brianc/node -postgres / pull / 38), чтобы вы могли просто передать буфер.   -  person Craig Ringer    schedule 30.10.2012
comment
Спасибо за комментарии. Я использую node-postgres v. 0.8.6 и любую версию postgres, которую использует Heroku. Предположительно это 9. что-то. Я посмотрел на базу данных, и единственные данные в столбце данных - это \ x. Я нашел работу, изменив поле на текстовое поле и сохранив файл в виде шестнадцатеричной строки. Я не думаю, что это такая уж хорошая идея.   -  person Clive    schedule 30.10.2012
comment
Спасибо, я могу это сделать.   -  person Clive    schedule 31.10.2012


Ответы (1)


Хитрость заключается в том, чтобы закодировать в шестнадцатеричном формате и добавить к файлу \ 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 package = '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 ($1)',
                           [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});
  });
});
person qooleot    schedule 18.01.2013