6

サーバー側に大きなファイルをアップロードする必要があるプロジェクトに取り組んでいます。HTML5 FileReader と jQuery を使用して、ファイルをチャンク (ArrayBuffer) でアップロードすることにしました。

チャンクを base64 文字列に変換し、JSON 形式の data パラメータを使用して jQuery.post を介してバックエンド サーバーに送信することで、このタスクを正常に完了しました。

例えば

$.ajax({
    url: "/Home/Upload",
    type: "POST",
    data: {
        name: block.name,
        index: block.index,
        base64: base64
    },
    processData: true
});

しかし、base64 は大きすぎて変換できないため、このコードを最適化したいと考えています。ArrayBuffer を介して直接送信できるかどうかを知りたい$.ajaxです。

processData: falseを設定してArrayBuffer を data パラメータに入れるだけで、サーバー側に として送信できることを知っていますRequest.InputStreamnameしかし、この方法ではやなどの他のデータを添付することはできませんindex

生の ArrayBuffer (または blob、バイナリ) を他のデータ (名前、インデックス) と一緒に 1 回の ajax 呼び出しで送信してもよいかどうかを知りたいです。

4

1 に答える 1

5

私はこの問題を解決したと思います。FormData を使用して、構造化データのみをファイル バイナリと共に 1 つの形式に変換できます。このようなコード

var blob = file.slice(block.start, block.end);
// formdata を使用して arraybuffer のブロック コンテンツを送信します
var fd = new FormData();
fd.append("名前", block.name);
fd.append("index", block.index);
fd.append("ファイル", blob);
$.ajax({
    url: "/Home/UploadInFormData",
    データ: fd,
    プロセスデータ: false,
    contentType: "マルチパート/フォームデータ",
    タイプ: "ポスト",
    成功: 関数 (結果) {
        if (!result.success) {
            アラート (結果。エラー);
        }
        コールバック (ヌル、block.index);
    }
});

Request.Form次に、サーバー側から、バイナリ コンテンツから構造化データを取得できます。Request.Files[0]

于 2013-06-27T06:56:38.937 に答える