【发布时间】: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