0

複数のファイルBlobを XHR2 経由で Node.js/Express サーバーにチャンクして送信します。

それらが正しくまとめられていることを確認しながら、サーバーでそれらを受信するにはどうすればよいですか? 複数のファイルが「一度に」アップロードされる場合、正しい順序で正しいファイルに。

以下は、私がこれまでに持っているコード (フロントエンドとバックエンドの両方) ですが、まだ複数のアップロードを考慮していません。

フロントエンド:

// 'files' is of type FileList, directly from file input.
for (var i = 0, length = files.length; i < length; i++) {
    var file = files[i];

    var bytes = 51200; // 50 KB
    var size = file.size;
    var start = 0;
    var end = bytes;

    while (start < size) {
        sendBlob(file.slice(start, end), file.name, file.type);
        start = end;
        end = start + bytes;
    }   
}   

// sendBlob()
var sendBlob: function (data, filename, filetype) {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', this.url, false);
    xhr.setRequestHeader('X_FILENAME', filename);
    xhr.setRequestHeader('Content-Type', filetype);
    xhr.send(data);
};

バックエンド:

app.post('/', function (req, res) {
    var body = '';
    req.on('data', function (data) {
        body += data;
    });
    req.on('end', function () {
        var filename = req.headers['x_filename'];
        var newPath = __dirname + '/upload/' + filename;
        fs.writeFile(newPath, body, function (err) {
            res.send({
                filename: filename
            });
        });
    });
});

非常に小さなテキスト ファイルは正しく保存されますが、画像は常に混乱し、最終的にファイル サイズが大きくなるようです。より大きなテキスト ファイルは正しく書き込まれますが、最初のチャンクが欠落しているようです。

4

1 に答える 1

0

あなたのアップロード ロジックは単純です。正確性を確保するために行うべきいくつかのことを次に示します。

  1. 順序を維持できるように、クライアントとサーバーの間でチャンク ID/番号を維持および通信する必要があります。

    var sendBlob: function (data, filename, filetype, chunkid)
    //set chunkid in header or in data.
    
  2. サーバーでは、投稿リクエストを受け入れて本文に追加しています。ファイル名とファイルタイプの変数を維持し、追加する前に着信要求と一致させる必要があります。

    Files[Name] = { //Create a new Entry in The Files Variable for each new file
        Filetype : "",
        FileSize: 0,//size of Data in buffer  
        Data: "",  //buffer for storing data
        Downloaded:  //chunks recieved
    }
    

    チェックしたときだけデータに追加します。(余分なファイルサイズはこれが原因である可能性があります)

  3. エンコーディングをバイナリとして設定する必要がありますfs.writeFile。画像およびビデオ ファイルはバイナリ エンコードされており、デフォルトの utf-8 エンコーディングに書き込むと破損する可能性があります。

    fs.writeFile(newPath, body, 'binary', function (err){...});
    
  4. (オプション) サーバーが受信したチャンクごとに、受信確認をクライアントに送信して、どのチャンクがドロップされ、送信する必要があるかを認識できるようにする必要があります。

于 2013-03-20T06:49:11.480 に答える