我编写了一个流星应用程序,在 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
属性上的拆分调用可能有问题,或者我在编码方面遗漏了一些明显的东西......?
该问题似乎与拆分有关,因为合并文件与原始文件的差异显示以下有趣的模式: