gpt4 book ai didi

javascript - 使用 socket.io/node.js 上传文件 block 不适用于非文本文件

转载 作者:行者123 更新时间:2023-11-30 13:08:02 25 4
gpt4 key购买 nike

只是在搞乱 node.js,我试图让一个文件 uploader 工作,在客户端对文件进行分块,通过 socket.io 将片段发送到服务器,然后重新组装。这是一个相当幼稚的实现,但只是想学习。目前,如果我提交一个文本文件,它会移动并正确重新组合,但如果我尝试上传一个图像文件,编码就会困惑并且文件已损坏。

我在客户端读取二进制字符串, Node fs 编码设置为二进制。还需要发生什么?

客户端代码

while(start < fileSize)
{
var reader = new FileReader();
reader.onload = function(e){
var data = {
"data" : e.target.result,
"sequence" : chunkCount++
};
socket.emit("sendChunk", data, function(data){
console.log("Confirmation recieved");
});
console.log("Log: Sent");
};

reader.onerror = function(e){
alert(e.getMessage());
};

var blob = file.slice(start, end);
reader.readAsBinaryString(blob);
start = end;
end = end + chunkSize;

}

服务器代码

socket.on('sendChunk', function (data) {
fs.appendFileSync(path + fileName, data.data, 'binary');
console.log(data.sequence + ' - The data was appended to file ' + fileName);
});

更新

根据给出的建议,我更新了代码以使用 base64 解码。有时仍然会出现一些排序问题,但大部分文件都可以正确传输。

客户端代码:

var data = {
"data" : window.btoa(e.target.result),
"sequence" : chunkCount++
};
socket.emit("sendChunk", data, function(data){
console.log("Confirmation recieved");
});

服务器代码:

var decoded =  new Buffer(data.data, 'base64').toString('binary');
fs.appendFileSync(path + fileName, decoded, 'binary');

最佳答案

socket.emit() 是用 JavaScript 编写的,因此将有效负载视为 JavaScript String。您在服务器上收到乱码数据,因为在 JavaScript 中字符串以 UCS-2 表示,并且某些控制字符被转义。换句话说:JavaScript 字符串不是字节大小字符的数组,它不适合存储或传输二进制数据。

传输图像最安全的方式是encode the binary data as base64在客户端上,并在服务器上解码 the Buffer class .

关于javascript - 使用 socket.io/node.js 上传文件 block 不适用于非文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14939971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com