【问题标题】:write base64 to file using stream使用流将base64写入文件
【发布时间】:2014-06-14 12:35:05
【问题描述】:

我正在向我的服务器发送一个 base64 字符串。在服务器上,我想创建一个可读流,我将 base64 块推送到该流上,然后转到可写流并写入文件。我的问题是只有第一个块被写入文件。我的猜测是因为我为每个块创建了一个新缓冲区,这就是导致问题的原因,但是如果我只发送字符串块而不创建缓冲区,则图像文件已损坏。

var readable = new stream.Readable();

readable._read = function() {}

req.on('data', function(data) {
    var dataText = data.toString();
    var dataMatch = dataText.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/);
    var bufferData = null;

    if (dataMatch) {
        bufferData = new Buffer(dataMatch[2], 'base64')
    }

    else {
        bufferData = new Buffer(dataText, 'base64')
    }

    readable.push(bufferData)
})

req.on('end', function() {
    readable.push(null);
})

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    这并不像你想象的那么简单:

    1. 使用Transform,而不是Readable。您可以pipe请求流进行转换,从而处理背压。

    2. 您不能使用正则表达式,因为您期望的文本可能会分成两个或更多块。您可以尝试每次累积块并执行正则表达式,但如果流的格式不正确(即不是data uri),您最终将缓冲整个请求并在兆字节上运行很多次正则表达式长字符串。

    3. 你不能任意取块并执行new Buffer(chunk, 'base64'),因为它本身可能无效。示例:new Buffer('AQID', 'base64') 产生 new Buffer([1, 2, 3]),但 Buffer.concat([new Buffer('AQ', 'base64'), new Buffer('ID', 'base64')]) 产生 new Buffer([1, 32])

    对于第 3 个问题,您可以使用其中一个可用模块(如 base64-stream)。这是一个例子:

    var base64 = require('base64-stream');
    var stream = require('stream');
    
    var decoder = base64.decode();
    var input = new stream.PassThrough();
    var output = new stream.PassThrough();
    
    input.pipe(decoder).pipe(output);
    
    output.on('data', function (data) {
      console.log(data);
    });
    
    input.write('AQ');
    input.write('ID');
    

    您可以看到它缓冲输入并在到达时立即发出data

    至于2个问题,你需要实现简单的流解析器。作为一个想法:等待data: 字符串,然后缓冲块(如果需要它们)直到找到;base64,,然后通过管道传输到base64-stream

    【讨论】:

    • 谢谢@vkurchatkin!我不确定我是否听懂了你所说的一切。我想将每个块推送到流中。我有一个使用 on('data' 的工作解决方案并连接每个块然后创建一个缓冲区并推送到流上,但正如我所说的我想流式传输每个块。我在发布这个问题之前短暂尝试了 base64-stream 但不是让它工作。你能给出一个快速粗略的代码示例吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多