我有一个库,它以 ReadableStream
的输入为输入,但我的输入只是base64格式映像。我可以将我在Buffer
中的数据转换为:
var img = new Buffer(img_string, 'base64');
,但我不知道如何将其转换为ReadableStream
或将Buffer
转换为ReadableStream
。
有没有办法做到这一点?
nodejs 10.17.0及以上:
const { Readable } = require('stream');
const stream = Readable.from(myBuffer);
类似的东西...
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
在一般课程中,可读的流的_read
功能应从基础源收集数据,并且push
它会逐渐确保您在需要之前不会将巨大的源收集到内存中。
在这种情况下,尽管您已经在内存中具有源,因此不需要_read
。
推动整个缓冲区只将其包裹在可读的流API中。
节点流缓冲区显然是设计用于测试的;无法避免延迟使其成为生产使用的糟糕选择。
Gabriel Llamas在此答案中建议流媒体:如何将缓冲区包裹为流式的流?
您可以使用节点流缓冲区这样创建一个ReadAbleSream:
// 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");
频率不能为0,因此这将引入一定的延迟。
您可以使用标准nodejs stream api为此 - stream.predable.from
const { Readable } = require('stream');
const stream = Readable.from(buffer);
注意:如果缓冲区包含二进制数据,请勿将缓冲区转换为字符串(
buffer.toString()
)。它将导致损坏的二进制文件。
您无需为一个文件添加整个NPM lib。我将其重构为打字稿:
import { Readable, ReadableOptions } from "stream";
export class MultiStream extends Readable {
_object: any;
constructor(object: any, options: ReadableOptions) {
super(object instanceof Buffer || typeof object === "string" ? options : { objectMode: true });
this._object = object;
}
_read = () => {
this.push(this._object);
this._object = null;
};
}
基于节点流程仪(如上所述的最佳选项)。
这是一个使用 streamifier 模块的简单解决方案。
const streamifier = require('streamifier');
streamifier.createReadStream(new Buffer ([97, 98, 99])).pipe(process.stdout);
您可以将字符串,缓冲区和对象用作其参数。
这是我的简单代码。
import { Readable } from 'stream';
const newStream = new Readable({
read() {
this.push(someBuffer);
},
})
尝试以下:
const Duplex = require('stream').Duplex; // core NodeJS API
function bufferToStream(buffer) {
let stream = new Duplex();
stream.push(buffer);
stream.push(null);
return stream;
}
来源:Brian Mancini-> http://derpturkey.com/buffer-to-stream-in-node/