Хранение файла в 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 хэши вычисляются при записи файла и проверяются при считывании обратно.
- быстро - автоматически кэширует горячие данные, чтобы сохранить базу данных ненужных усилий.