【问题标题】:Write base64 chunks into writestream将 base64 块写入 writestream
【发布时间】:2014-04-08 11:39:30
【问题描述】:

我与 node.js v0.8 建立了客户端/服务器套接字连接。客户端将 jpg 编码为 base64 字符串并将其发送到服务器。服务器正在接收这些块并将其写入写入流。写入数据后,新图像文件的大小与原始图像文件相同,但当我尝试打开它时显示损坏的消息。我是不是在 base64 编码或流写入方面出了什么问题?

Client.js 和 Server.js sn-p:

//Client sending base64 encoded string from image

var net = require('net');
var fs = require('fs');

var socket = new net.Socket();

socket.connect(3000, '127.0.0.1', function() {

    var stream = fs.createReadStream(__dirname + '/node.jpg', {encoding: 'base64'});

    stream.on('data', function(chunk){
        socket.write(chunk, 'base64');
    });

});


//Server should write base64 string into new image file

var net = require('net');
var fs = require('fs');

var imageFilename = "node-copy.jpg";

var writeStream = fs.createWriteStream(__dirname + '/node-copy.jpg', {flags: 'a',  encoding: 'base64'});    

var server = net.createServer(function(socket){  

  socket.setEncoding('base64');

  socket.on("data", function(chunk){
    writeStream.write(chunk, 'base64');
  });

}).listen(3000, '127.0.0.1');

【问题讨论】:

  • 您能解释一下为什么要将其编码为base64 吗?从您显示的代码来看,没有理由这样做。
  • @loganfsmyth:我使用 base64 是因为我想流式传输二进制文件。还有其他方法吗?
  • 设置base64意味着文件在发送前从二进制转换为字符串。只需省略所有编码,默认情况下它将以二进制形式发送。
  • @loganfsmyth:我知道这个 sn-p 没有意义,但这只是一个简化的例子。这个想法是将带有文件名的 jpg 数据从客户端传输到服务器,所有内容都是带有分隔符的 base64 编码字符串。所以我可以拆分数据并在服务器上创建一个带有文件名的 jpg。但首先必须将示例中的 base64 流正确写入文件。您知道如何使用 writestream 来完成此操作吗?
  • 您所描述的是在流中发送文档+元数据。这就是 HTTP 旨在完成的任务,因此我建议您使用 HTTP 连接并将文件名作为标头发送,将图像作为正文发送。

标签: javascript node.js sockets stream base64


【解决方案1】:

您将每个块编码为一个单独的实体,这是错误的做法。

使用像this one这样的流式base64模块。

【讨论】:

  • 您知道如何在不使用 3rd 方模块的情况下对其进行编码吗?
  • 是的。编写您自己的模块来实现此功能。
猜你喜欢
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 2014-08-15
  • 2018-07-02
  • 1970-01-01
相关资源
最近更新 更多