node.jsをいじくり回して、クライアント側でファイルをチャンクし、socket.ioを介してサーバーにピースを送信し、再アセンブルするファイルアップローダーを機能させようとしています。これはかなり単純な実装ですが、学習しようとしているだけです。現在、テキストファイルを送信すると、移動して正しく再構築されますが、たとえば画像ファイルをアップロードしようとすると、エンコーディングが混乱し、ファイルが破損します。
クライアント側でバイナリ文字列として読み取っていますが、ノードの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');