2012-10-29 14 views
5

Próbuję zapisać mały plik w bazie danych Postgres przy użyciu modułu node-postgres. Rozumiem, że powinienem użyć tego typu danych bytea. Problem mam jest, gdy robię pewne rzeczy jak:Przechowywanie pliku w postgres przy użyciu węzła-postgresu

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

zawartość kolumny pliku w db jest: \ x i nic nie jest zapisane. Jeśli zmienię bufor danych na hex, to znaczy data.toString ("hex"), plik zostanie zapisany, ale formatowanie zostanie utracone po odczytaniu pliku z powrotem.

Jaki jest prawidłowy sposób przechowywania pliku w postgresie przy użyciu modułu node-postgres?

+1

Co pomoże tutaj jest zbadanie dane, które dostaje wstawiono do dane baza za pomocą 'psql'. Sprawdź, czy tam jest poprawny. Dzięki temu dowiesz się, czy problem polega na poprawnym wstawieniu danych, czy też na ponownym odczytaniu. Musisz także wspomnieć o swojej wersji Pg; domyślny format 'bytea' zmienił się z' escape' na 'hex' w 9.0. –

+1

Jakiej używam wersji 'node-postgres'? Wygląda na to, że obsługuje on bytea około roku temu (https://github.com/brianc/node-postgres/pull/38), więc powinieneś móc po prostu przekazać bufor. –

+0

Dzięki za komentarze. Używam node-postgres v. 0.8.6 i jakiejkolwiek wersji postgres, której używa Heroku. Prawdopodobnie jest to 9. coś. Spojrzałem na db i jedyne dane w kolumnie danych to \ x. Znalazłem pracę, zmieniając pole na pole tekstowe i przechowując plik jako ciąg szesnastkowy. Nie sądzę jednak, że to świetny pomysł. – Clive

Odpowiedz

12

Sztuką jest kodowanie jako hex i poprzedzanie pliku \ x. Czytając go wycofać rzeczywiście jest obsługiwana przez parseByteA które zwraca bufor:

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

Oto co zrobiłem, aby przeczytać w obrazie z dysku na PostgreSQL 9.2.2 i 0.8.16 oraz node- node.js PostgreSQL (nPM pakiet = „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); 
     }); 
     }); 

i co zrobiłem, aby zapisać go z powrotem

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}); 
    }); 
}); 
Powiązane problemy