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

Posted

技术标签:

【中文标题】使用 node-postgres 在 postgres 中存储文件【英文标题】:Storing a file in postgres using node-postgres 【发布时间】:2012-10-18 22:47:14 【问题描述】:

我正在尝试使用 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 的正确方法是什么?

【问题讨论】:

这里将帮助您检查使用psql 插入数据库的数据。看看那里是否正确。这将告诉您问题是正确插入数据还是读回数据。您还需要提及您的 Pg 版本;默认bytea格式在9.0中从escape更改为hex 您使用的是什么node-postgres 版本?看起来它大约在一年前支持 bytea (github.com/brianc/node-postgres/pull/38) 所以你应该能够只传递一个缓冲区。 感谢 cmets。我正在使用 node-postgres v. 0.8.6 以及 Heroku 使用的任何版本的 postgres。大概是9.something。我查看了db,数据列中唯一的数据是\x。我通过将字段更改为文本字段并将文件存储为十六进制字符串找到了解决方法。不过,我认为这不是一个好主意。 看起来它应该工作;在这里查看单元测试github.com/drdaeman/node-postgres/commit/…。如果您发现可以在测试用例中重现它,也许您需要使用 DDL 脚本制作一个自包含的可编译测试用例并使用 node-postgres 提交错误? 谢谢,我可能会这样做。 【参考方案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);
  );
);

【讨论】:

以上是关于使用 node-postgres 在 postgres 中存储文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 node-postgres 在 utc 中获取 Postgres“没有时区的时间戳”

具有大量查询的 node-postgres

如何在服务器中使用 node-postgres?

如何在服务器中使用 node-postgres?

使用 node-postgres 更新数据的更简单方法?

使用 node-postgres 查询的 Promise 总是返回 undefined