使用node-postgres在postgres中存储文件

时间:2012-10-29 15:32:42

标签: node.js postgresql node-postgres

我正在尝试使用node-postgres模块将一个小文件存储到postgres数据库中。我知道我应该使用bytea数据类型来执行此操作。我遇到的问题是当我做一些事情时:

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

db中文件列的内容为:\ x,不存储任何内容。如果我将数据缓冲区更改为十六进制,即data.toString('hex'),则会存储该文件,但是当我将文件读回时,所有格式都会丢失。

使用node-postgres模块将文件存储到postgres的正确方法是什么?

2 个答案:

答案 0 :(得分:15)

诀窍是编码为十六进制并使用\ 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});
  });
});

答案 1 :(得分:0)

我建议你看看SQLGrid

自述文件:

  • 高效 - 使用自动内联重复数据删除节省空间。
  • 轻松 - 使用开发人员友好的API读取和写入文件,就好像它们在磁盘上一样。
  • 修订 - 保留多个版本的文件。
  • 字节范围 - 支持字节范围以允许流媒体。
  • 一致 - Sha256哈希值在写入文件时计算,并在读回时进行验证。
  • 快速 - 自动缓存热数据以节省数据库不必要的工作量。