2012-10-29 1 views
5

node-postgres 모듈을 사용하여 작은 파일을 postgres db에 저장하려고합니다. 이 작업을 수행하려면 bytea 데이터 형식을 사용해야 함을 이해합니다. DB를에서 파일을 열node-postgres를 사용하여 postgres에 파일 저장하기

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

내용입니다 : \ x와 아무것도 저장되지 않습니다 내가 좋아하는 어떤 일을 할 때 제가하는 데 문제는있다. 데이터 버퍼를 16 진수로 변경하면 즉, data.toString ('hex') 파일은 저장되지만 파일을 다시 읽을 때 모든 형식이 손실됩니다.

node-postgres 모듈을 사용하여 파일을 포스트그레스에 저장하는 올바른 방법은 무엇입니까?

+1

당신을 도움에 삽입됩니다 데이터를 검사하는 것입니다 무엇 데이터 'psql'을 사용하여 기본. 그것이 맞는지보십시오. 문제가 데이터를 올바르게 삽입했는지 또는 다시 읽는 지 여부가 알려줍니다. Pg 버전도 언급해야합니다. 디폴트'bytea '형식은 9.0에서'escape'에서'hex'으로 변경되었습니다. –

+1

어떤'node-postgres' 버전을 사용하고 있습니까? 약 1 년 전 (https://github.com/brianc/node-postgres/pull/38) bytea를 지원하는 것처럼 보이므로 버퍼를 전달할 수 있어야합니다. –

+0

의견에 감사드립니다. 나는 node-postgres v. 0.8.6과 Heroku가 사용하는 postgres 버전을 사용하고 있습니다. 아마도 그것은 9.Something입니다. 나는 db를 보았고 data 열의 유일한 데이터는 \ x이다. 필자는 필드를 텍스트 필드로 변경하고 파일을 16 진수 문자열로 저장하여 해결 방법을 찾았습니다. 나는 이것이 훌륭한 생각이라고 생각하지 않는다. – Clive

답변

12

트릭은 16 진수로 인코딩하고 파일 앞에 \ x를 붙이는 것입니다.

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

내가 포스트 그레스 9.2.2에 디스크 이미지에서 읽을 무슨 짓을하고 0.8.16 및 노드 -를 Node.js를 : 그것은 밖으로 다시 읽는 것은 참으로 버퍼를 반환 parseByteA를 통해 지원됩니다 포스트 그레스 (NPM 패키지 = '페이지') 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}); 
    }); 
});