2012-10-29 50 views
5

我試圖保存一個小文件到一個Postgres存儲在Postgres的文件DB使用節點的Postgres模塊。我明白我應該使用bytea數據類型來完成此操作。我遇到的問題是當我做一些事情時:使用節點的Postgres

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

db中文件列的內容是:\ x並且不存儲任何內容。如果我將數據緩衝區更改爲十六進制,即data.toString('十六進制'),則會存儲該文件,但是當我將文件讀回時,所有格式都會丟失。

什麼是存儲文件到使用節點的Postgres模塊的Postgres的正確方法是什麼?

+1

什麼會幫助你在這裏是檢查被插入到數據數據base使用'psql'。看看它在那裏是否正確。這將告訴你,如果問題是正確插入數據,或者讀取數據。您還需要提及您的Pg版本;在9.0中默認的'bytea'格式從'escape'改爲'hex'。 –

+1

你使用的是什麼'node-postgres'版本?它看起來像它支持BYTEA爲約一年前(https://github.com/brianc/node-postgres/pull/38),所以你應該能夠只是傳遞的緩衝區。 –

+0

感謝您的意見。我正在使用node-postgres v。0.8.6以及Heroku使用的任何版本的postgres。據推測這是一個9.something。我查看了數據庫,數據列中的唯一數據是\ x。通過將字段更改爲文本字段並將文件存儲爲十六進制字符串,我找到了解決辦法。不過,我認爲這不是一個好主意。 – Clive

回答

12

訣竅是編碼爲十六進制和前面加上\ x中的文件。回讀出通過parseByteA返回的緩衝區確實支持:

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

這裏是我做過什麼從Postgres的9.2.2磁盤圖像中的閱讀和Node.js的0.8.16和節點 - 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 ($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}); 
    }); 
});