11

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であり、何も保存されません。データバッファを16進数、つまりdata.toString('hex')に変更すると、ファイルは保存されますが、ファイルを読み戻すとすべてのフォーマットが失われます。

node-postgresモジュールを使用してファイルをpostgresに保存する正しい方法は何ですか?

4

1 に答える 1

17

秘訣は、16進数としてエンコードし、ファイルの前に\xを付けることです。それを読み戻すことは、バッファを返すparseByteAを介して実際にサポートされています。

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

これは、postgres9.2.2とnode.js0.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});
  });
});
于 2013-01-18T21:47:34.037 に答える