2012-11-05 15 views
30

Jestem całkiem nowy w buforach i ReadableStreams, więc może to jest głupie pytanie. Mam bibliotekę, która pobiera jako dane wejściowe wartość ReadableStream, ale moje dane wejściowe są po prostu obrazem w formacie base64. mogę przekonwertować dane mam w buforze tak:Konwersja bufora na ReadableStream in nodejs

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

Ale nie mam pojęcia, jak przekonwertować go do ReadableStream lub zamiany bufora I otrzymany w ReadableStream.

Czy istnieje sposób, aby to zrobić, czy staram się osiągnąć niemożliwe?

Dzięki.

Odpowiedz

20

Można utworzyć ReadableStream korzystając Node Stream Buffers tak:

// 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"); 

częstość nie może być 0, więc będzie to wprowadzać pewne opóźnienie.

+0

Dzięki, chociaż trochę późno. Nie pamiętam, jak rozwiązałem problem, ale to wygląda na miłe rozwiązanie. Jeśli ktokolwiek to potwierdzi, będzie świetnie. Pamiętam, że znalazłem ZERO na temat tego nawrócenia. – Masiar

+0

Potwierdzając, że to działa - znalazłem to przy wyszukiwaniu sposobu przekształcania buforów plików w strumienie. –

+0

Jeśli masz pliki z plikami, powinieneś od razu otworzyć strumień odczytu pliku: http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options – vanthome

32

Node Stream Buffer jest oczywiście przeznaczony do użytku w testowaniu; niemożność uniknięcia opóźnienia sprawia, że ​​jest to zły wybór do zastosowań produkcyjnych.

Gabriel Llamas sugeruje streamifier w tej odpowiedzi: How to wrap a buffer as a stream2 Readable stream?

+0

Chcę tylko powiedzieć, że to najlepsze rozwiązanie, w niektórych przypadkach przyspieszyło to moje przesyłanie prawie 10-krotnie. Dzięki!! – Abadaba

+0

Rozważ to rozwiązanie, a nie zaakceptowane jako odpowiedź. –

6

coś takiego ...

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 

W ogólnym oczywiście _read funkcja czytelnej Stream powinien zbierać dane z źródle i push ją stopniowo upewniając się, że nie zgromadzisz ogromnego źródła do pamięci, zanim będzie ona potrzebna.

W tym przypadku, chociaż masz już źródło w pamięci, więc _read nie jest wymagane.

Przesunięcie całego bufora powoduje owinięcie go w czytelny api.

0

Oto proste rozwiązanie przy użyciu modułu streamifier.

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

Można używać łańcuchów, bufor i przedmiot jako jej argumenty.