我编写了一个流星应用程序,在FileReader API的帮助下将二进制数据片段发送到服务器。
处理客户端切片的方法:
var readSlice = function() {
var start, end;
start = chunk * chunkSize;
if (start > file.size) {
start = end + 1;
}
end = start + (chunkSize - 1) >= file.size ? file.size : start + (chunkSize - 1);
fileReader.onload = function(event) {
if (++chunk <= chunks) {
Meteor
.apply("saveChunk", [ event.target.result.split(',')[1], file.name, clientRegistration, now, (chunk === chunks) ], {
wait : true
});
readSlice();
} else {
/*
* TODO Notify the GUI
*/
console.log("reading done");
}
};
fileReader.readAsDataURL(blobSlice.call(file, start, end));
};
服务器以正确的顺序接收切片,并以下列方式合并:
saveChunk : function(chunk, name, registration, timestamp, last) {
...
tempFile = Meteor.fileTemp + "/" + identifier;
fs.appendFile(tempFile, new Buffer(chunk, "base64"), {
encoding : "base64",
mode : 438,
flag : "w"
}, function(error) {
if (error) {
throw (new Meteor.Error(500, "Failed to save file.", err));
}
});
}
这个过程几乎没问题。但是文件中的细微差别会导致输出损坏。二进制差异出现在文件中输出被分割的位置,所以可能在event.target.result
属性上的拆分调用有问题,或者我可能遗漏了编码方面明显的东西......?
问题似乎与拆分有关,因为合并文件与原始文件的差异显示以下有趣的模式:
答案 0 :(得分:1)
损坏的数据是一个简单的计算错误的结果:
使用
end = (start + chunkSize ) >= file.size ? file.size : (start + chunkSize);
而不是
end = start + (chunkSize - 1) >= file.size ? file.size : start + (chunkSize - 1);
解决了问题。