2012-10-29 1 views
5

Tôi đang cố gắng lưu trữ một tệp nhỏ vào một db postgres bằng cách sử dụng mô đun nút-postgres. Tôi hiểu rằng tôi nên sử dụng loại dữ liệu bytea để làm điều này. Vấn đề tôi gặp phải là khi tôi làm một số việc như:Lưu trữ một tệp trong postgres bằng cách sử dụng nút postgres

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

Nội dung của cột tệp trong db là: \ x và không có gì được lưu trữ. Nếu tôi thay đổi bộ đệm dữ liệu thành hex, ví dụ: data.toString ('hex') thì tệp được lưu trữ nhưng tất cả định dạng bị mất khi tôi đọc lại tệp.

Cách lưu trữ tệp đúng cách vào postgres bằng mô đun nút-postgres là gì?

+1

điều gì sẽ giúp bạn ở đây là để kiểm tra các dữ liệu đó được đưa vào dữ liệu cơ sở sử dụng 'psql'. Xem nó có đúng không. Điều đó sẽ cho bạn biết nếu vấn đề là với chèn dữ liệu một cách chính xác, hoặc với đọc nó trở lại. Bạn cũng cần phải đề cập đến phiên bản Pg của bạn; định dạng 'bytea' mặc định đã thay đổi từ' escape' thành 'hex' trong 9.0. –

+1

Bạn đang sử dụng phiên bản 'node-postgres' nào? Dường như nó hỗ trợ bytea như của khoảng một năm trước đây (https://github.com/brianc/node-postgres/pull/38) vì vậy bạn sẽ có thể chỉ cần vượt qua một bộ đệm. –

+0

Cảm ơn các ý kiến. Tôi đang sử dụng node-postgres v. 0.8.6 và bất kỳ phiên bản nào của postgres mà Heroku sử dụng. Có lẽ đó là một 9.something. Tôi nhìn vào db và dữ liệu duy nhất trong cột dữ liệu là \ x. Tôi tìm thấy một công việc xung quanh bằng cách thay đổi trường thành một trường văn bản và lưu trữ tệp dưới dạng chuỗi hex. Tôi không nghĩ rằng đây là một ý tưởng tuyệt vời như vậy mặc dù. – Clive

Trả lời

12

Bí quyết là mã hóa dưới dạng hex và thêm vào tệp với \ x. Đọc nó sao ra thực sự được hỗ trợ thông qua parseByteA trả về một bộ đệm:

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

Dưới đây là những gì tôi đã làm để đọc trong một hình ảnh từ đĩa trên postgres 9.2.2 và 0.8.16 Node.js và node- postgres (NPM gói = '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); 
     }); 
     }); 

và những gì tôi đã viết nó lại ra

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}); 
    }); 
});