2012-11-05 6 views
30

Sono abbastanza nuovo su Buffer e ReadableStreams, quindi forse questa è una domanda stupida. Ho una libreria che prende come input un ReadableStream, ma il mio input è solo un'immagine in formato base64. Potrei convertire i dati che ho in un buffer in questo modo:Conversione di un buffer in ReadableStream in nodejs

var img = new Buffer(img_string, 'base64'); 

Ma non ho idea di come convertire in un ReadableStream o convertire il buffer ho ottenuto ad un ReadableStream.

C'è un modo per fare questo o sto cercando di raggiungere l'impossibile?

Grazie.

risposta

20

È possibile creare un ReadableStream utilizzando Node Stream Buffers in questo modo:

// Initialize stream 
var myReadableStreamBuffer = new streamBuffers.ReadableStreamBuffer({ 
    frequency: 10,  // in milliseconds. 
    chunkSize: 2048  // in bytes. 
}); 

// With a buffer 
myReadableStreamBuffer.put(aBuffer); 

// Or with a string 
myReadableStreamBuffer.put("A String", "utf8"); 

La frequenza non può essere 0 quindi questo introdurrà un certo ritardo.

+0

Grazie, anche se un po 'in ritardo. Non ricordo come ho risolto il problema, ma questa sembra una buona soluzione. Se qualcuno lo conferma, sarebbe fantastico. Ricordo di aver trovato ZERO su questa conversione. – Masiar

+0

Confermando che funziona: trovato questo quando si cerca come trasformare i file buffer in flussi. –

+0

Se hai file con i file, dovresti piuttosto aprire immediatamente un file di lettura con questo: http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options – vanthome

32

Node Stream Buffer è ovviamente progettato per l'uso nei test; l'incapacità di evitare un ritardo ne fa una scelta sbagliata per l'uso in produzione.

Gabriel Llamas suggerisce streamifier in questa risposta: How to wrap a buffer as a stream2 Readable stream?

+0

Voglio solo commentare questa è la soluzione migliore, ha velocizzato i miei caricamenti di quasi 10 volte in alcuni casi. Grazie!! – Abadaba

+0

Considerare questa soluzione oltre a quella accettata come risposta. –

6

qualcosa di simile ...

import { Readable } from 'stream' 

const buffer = new Buffer(img_string, 'base64') 
const readable = new Readable() 
readable._read =() => {} // _read is required but you can noop it 
readable.push(buffer) 
readable.push(null) 

readable.pipe(consumer) // consume the stream 

Nel corso generale, la funzione di un flusso leggibile _read dovrebbe raccogliere i dati dalla sorgente sottostante e push in modo incrementale assicurandoti di non raccogliere un'enorme fonte nella memoria prima che sia necessaria.

In questo caso, sebbene sia già presente la fonte in memoria, non è necessario _read.

Spingere l'intero buffer lo avvolge semplicemente nel flusso leggibile api.

0

Ecco una soluzione semplice che utilizza il modulo streamifier.

const streamifier = require('streamifier'); streamifier.createReadStream(new Buffer ([97, 98, 99])).pipe(process.stdout);

È possibile utilizzare stringhe, buffer e oggetti come i suoi argomenti.