2015-06-23 17 views
12

Sto cercando di inserire un'immagine in un file PDF Sto creando un server con PDFkit. Sto usando cfs: dropbox per archiviare i miei file. Prima quando stavo usando cvs: filesystem, è stato facile aggiungere le immagini ai miei pdf perché erano proprio lì. Ora che sono archiviati in remoto, non sono sicuro di come aggiungerli, dal momento che PDFkit non supporta l'aggiunta di immagini con solo l'url. Tuttavia, accetta un buffer. Come posso ottenere un buffer dai miei file CollectionFS?Come posso ottenere un buffer per un file (immagine) da CollectionFS

Finora ho qualcosa di simile:

var portrait = Portraits.findOne('vS2yFy4gxXdjTtz5d'); 
readStream = portrait.createReadStream('portraits'); 

Ho provato a ottenere il buffer di due modi finora:

In primo luogo utilizzando DataMan, ma l'ultimo comando non torna:

var dataMan = new DataMan.ReadStream(readStream, portrait.type()); 
var buffer = Meteor.wrapAsync(Function.prototype.bind(dataMan.getBuffer, dataMan))(); 

Secondo buffering del flusso manualmente:

var buffer = new Buffer(0); 
readStream.on('readable', function() { 
    buffer = Buffer.concat([buffer, readStream.read()]); 
}); 
readStream.on('end', function() { 
    console.log(buffer.toString('base64')); 
}); 

Anche questo sembra non tornare mai più. Ho ricontrollato il mio documento per assicurarmi che fosse lì e ha un url valido e l'immagine appare quando inserisco l'url nel mio browser. Mi sto perdendo qualcosa?

+0

cosa intendi per "non torna mai"? Come/dove nel tuo codice stai usando queste soluzioni. Il secondo dovrebbe funzionare. –

+0

inoltre, stai chiamando 'readStream.read()' ovunque? –

+0

Con "non torna mai", voglio dire che la richiamata per l'evento "end" non viene mai eseguita (non vedo il messaggio di log nella console). –

risposta

5

che dovevo fare qualcosa di simile e poiché non c'è risposta a questa domanda, ecco come lo fanno:

// take a cfs file and return a base64 string 
var getBase64Data = function(file, callback) { 
    // callback has the form function (err, res) {} 
    var readStream = file.createReadStream(); 
    var buffer = []; 
    readStream.on('data', function(chunk) { 
    buffer.push(chunk); 
    }); 
    readStream.on('error', function(err) { 
    callback(err, null); 
    }); 
    readStream.on('end', function() { 
    callback(null, buffer.concat()[0].toString('base64')); 
    }); 
}; 

// wrap it to make it sync  
var getBase64DataSync = Meteor.wrapAsync(getBase64Data); 

// get a cfs file 
var file = Files.findOne(); 

// get the base64 string 
var base64str = getBase64DataSync(file); 

// get the buffer from the string 
var buffer = new Buffer(base64str, 'base64') 

Spero che ti aiuto!

+0

Non l'ho provato, ma sembra esattamente quello che stavo cercando di capire. A luglio ho appena salvato la stringa 64 di base direttamente sulla collezione, ma questo utilizza più spazio. Grazie per l'aiuto. –