[英]Uploading file chunks using socket.io/node.js not working with non-text files
只是搞亂了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');
socket.emit()
是用JavaScript編寫的,因此將有效負載視為JavaScript String
。 您在服務器上收到亂碼數據,因為JavaScript字符串在UCS-2中表示,並且某些控制字符正在轉義。 換句話說:JavaScript字符串不是字節大小的字符Array
,它不適合存儲或傳輸二進制數據。
傳輸圖像最安全的方法是在客戶端將二進制數據編碼為base64 ,並使用Buffer類在服務器上進行解碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.