簡體   English   中英

使用不與非文本文件一起使用的socket.io/node.js上載文件塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM