2012-10-29 6 views
5

Sto provando a memorizzare un piccolo file in un db postgres usando il modulo node-postgres. Capisco che dovrei usare il tipo di dati bytea per farlo. Il problema che sto avendo è quando faccio qualche cosa come:Memorizzare un file in postgres usando node-postgres

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

Il contenuto della colonna file nel db è: \ x e nulla viene memorizzato. Se cambio il buffer dei dati in esadecimale i.e. data.toString ('hex') il file viene memorizzato ma tutta la formattazione va persa quando rileggo il file.

Qual è il modo corretto di archiviare un file in postgres utilizzando il modulo node-postgres?

+1

Cosa vi aiuterà qui è quello di esaminare i dati che viene inserito nella dati base usando 'psql'. Vedi se è corretto lì. Questo ti dirà se il problema è con l'inserimento dei dati correttamente, o con la lettura di nuovo. Devi anche menzionare la tua versione Pg; il formato predefinito 'bytea' è cambiato da' escape' a 'hex' in 9.0. –

+1

Quale versione 'node-postgres' stai usando? Sembra che supporti bytea circa un anno fa (https://github.com/brianc/node-postgres/pull/38), quindi dovresti essere in grado di passare solo un buffer. –

+0

Grazie per i commenti. Sto usando node-postgres v. 0.8.6 e qualunque versione di postgres usata da Heroku. Presumibilmente è un 9. qualcosa. Ho guardato il db e l'unico dato nella colonna di dati è un \ x. Ho trovato un rimedio cambiando il campo in un campo di testo e memorizzando il file come una stringa esadecimale. Non penso che sia comunque una grande idea. – Clive

risposta

12

Il trucco è codificare come esadecimale e anteporre il file a \ x. Lettura di nuovo fuori è infatti supportata tramite parseByteA che restituisce un buffer:

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

Ecco quello che ho fatto leggere in un'immagine dal disco su Postgres 9.2.2 e 0.8.16 Node.js e node- Postgres (NPM pacchetto = '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); 
     }); 
     }); 

e quello che ho fatto scrivere di nuovo fuori

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