マルチパートファイルのペイロードコンテンツを正しく構築する

supercalifragilistichespirali

次の方法で、マルチパートPOSTリクエストを介してバイナリファイルを送信しています。

var xhr = new XMLHttpRequest();
body = '--' + boundary + '\r\n'
             + 'Content-Disposition: form-data; name="file"; '
             + 'filename="temp.bin"\r\n'
             + 'Content-type: application/octet-stream\r\n\r\n'
             + encryptedFileContent + '\r\n'
             + '--' + boundary + '--';
xhr.open("POST", "http://localhost:999/some/path", true);
xhr.setRequestHeader("Content-type", "multipart/form-data; boundary="+boundary);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200)
        console.log("File uploaded!");
}
xhr.send(body);

Chromeパッケージのアプリ内で送信していますが、この方法でファイルを送信する理由は、最初にファイルがローカルファイルシステムからを介して読み取られFileReader、次に暗号化されてから送信されるためです。encryptedFileContent次の方法で構築されます。

var reader = new FileReader();
reader.onload = function(e) {
     var plainArray = Array.apply([], new Int8Array(e.target.result));
     var encryptedArray = encrypt(plainArray);
     var encryptedFileContent="";
     for (var i=0; i<encryptedArray.length; i++) { 
          encryptedFileContent+=String.fromCharCode(encryptedArray[i]) 
     }
}
reader.readAsArrayBuffer(file);

デバッグすると、encryptedArrayには次の値が含まれていることがわかります。

[ 70, -21, -15, ... ]

サーバー側では、配列が読み取られると、同じデータが表示されると予想されますが、代わりに次のように表示されます。

[ -17, -66, -112, ... ]

バイナリファイルのペイロードを作成する方法が正しくないようです。String.fromCharCode問題ありますか?

supercalifragilistichespirali

サーバーで受信したバイト配列が異なる理由は、ペイロードがUnicodeに変換され、utf-8にエンコードされるためです。変換せずにデータを送信するには、次に説明するように、データをバイナリとして送信する必要があります。

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest?redirectlocale=en-US&redirectslug=DOM%2FXMLHttpRequest%2FUsing_XMLHttpRequest#Submitting_forms_and_uploading_files

if (!XMLHttpRequest.prototype.sendAsBinary) {
    XMLHttpRequest.prototype.sendAsBinary = function(sData) {
        var nBytes = sData.length, ui8Data = new Uint8Array(nBytes);
        for (var nIdx = 0; nIdx < nBytes; nIdx++) {
            ui8Data[nIdx] = sData.charCodeAt(nIdx) & 0xff;
        }
        /* send as ArrayBufferView...: */
        this.send(ui8Data);
        /* ...or as ArrayBuffer (legacy)...: this.send(ui8Data.buffer); */
    };
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Android用にクロスコンパイルするcmakeを使用したツールチェーンの構築

分類Dev

ページコンテンツをテキストファイルとしてダウンロードする

分類Dev

NetBSDを使用してクロスコンパイルNetBSDツールチェーンを構築する方法

分類Dev

SASマクロ変数のコンテンツとしてファイル内のコードを使用する

分類Dev

Google StorageのsignedUploadUrl、アップロードURLを取得すると次のようになります:コンテンツタイプが正しくありません。マルチパートを使用してください

分類Dev

コンテンツタイプマルチパートのAjaxアップロードファイルをGoLangサーバーに

分類Dev

ファイル名にスペースを含むファイルコンテンツをロードする

分類Dev

TalendでPostgresの「コピー」コマンドを使用してテーブルのコンテンツをCSVファイルにロードする

分類Dev

sedパターンマッチングは、スペースに遭遇した場合、ファイルのコンテンツを削除します

分類Dev

goでformdataを使用してマルチパートファイルリクエストのコンテンツ長を計算する方法

分類Dev

symfony2のコントローラー内にファイルコンテンツをロードする

分類Dev

特定のファイルの場所(macOS)に動的にリンクせずにコマンドラインツールを構築する

分類Dev

(Restクライアントから)RestTemplateを使用するときにマルチパートアップロードでファイルのコンテンツタイプを設定する方法

分類Dev

ページ内の特定のコンテンツを画像ファイルとしてキャプチャする

分類Dev

バッチファイルでコマンドFORを使用してテキストファイルのコンテンツを取得する方法

分類Dev

別のパイプラインビルドからアーティファクトコンテンツをダウンロードする

分類Dev

チャートプロパティのイベントロードでchart.renderer.textを使用して、デフォルトのツールチップと同等のカスタムツールチップをマウスオーバーに配置する方法

分類Dev

XMLファイルのコンテンツをロードしています

分類Dev

テキストファイルの文字エンコードを正しく決定する方法は?

分類Dev

ファイルアップロードAPI:マルチパート/フォームデータと本文の未加工コンテンツ?

分類Dev

404 NOT FOUND コンテンツを含むファイルをダウンロードする cURL コマンド

分類Dev

特定のコンテンツタイプなしでファイルをダウンロードする方法

分類Dev

テキストファイルのコンテンツをテキスト領域にロードする

分類Dev

SSHを使用してローカルテキストファイルの文字列をリモートコマンドに安全にパイプする

分類Dev

Linuxでコンテンツファイルをマルチファイルにコピーする

分類Dev

json構成ファイルを更新/追加するPythonのコマンドラインツール

分類Dev

cssファイルが「サーバー」モードで(scssファイルから)正しくインポートされるのに「dist」モードではインポートされないのはなぜですか?(ヨーマン、コンパス)

分類Dev

ファイルの実際のコンテンツをコピーせずに、ディレクトリ構造、フォルダ、サブフォルダ、ファイルプロパティ、メタデータをコピーする方法は?

分類Dev

QSHコマンドでプロパティファイルをインポートします-iseries

Related 関連記事

  1. 1

    Android用にクロスコンパイルするcmakeを使用したツールチェーンの構築

  2. 2

    ページコンテンツをテキストファイルとしてダウンロードする

  3. 3

    NetBSDを使用してクロスコンパイルNetBSDツールチェーンを構築する方法

  4. 4

    SASマクロ変数のコンテンツとしてファイル内のコードを使用する

  5. 5

    Google StorageのsignedUploadUrl、アップロードURLを取得すると次のようになります:コンテンツタイプが正しくありません。マルチパートを使用してください

  6. 6

    コンテンツタイプマルチパートのAjaxアップロードファイルをGoLangサーバーに

  7. 7

    ファイル名にスペースを含むファイルコンテンツをロードする

  8. 8

    TalendでPostgresの「コピー」コマンドを使用してテーブルのコンテンツをCSVファイルにロードする

  9. 9

    sedパターンマッチングは、スペースに遭遇した場合、ファイルのコンテンツを削除します

  10. 10

    goでformdataを使用してマルチパートファイルリクエストのコンテンツ長を計算する方法

  11. 11

    symfony2のコントローラー内にファイルコンテンツをロードする

  12. 12

    特定のファイルの場所(macOS)に動的にリンクせずにコマンドラインツールを構築する

  13. 13

    (Restクライアントから)RestTemplateを使用するときにマルチパートアップロードでファイルのコンテンツタイプを設定する方法

  14. 14

    ページ内の特定のコンテンツを画像ファイルとしてキャプチャする

  15. 15

    バッチファイルでコマンドFORを使用してテキストファイルのコンテンツを取得する方法

  16. 16

    別のパイプラインビルドからアーティファクトコンテンツをダウンロードする

  17. 17

    チャートプロパティのイベントロードでchart.renderer.textを使用して、デフォルトのツールチップと同等のカスタムツールチップをマウスオーバーに配置する方法

  18. 18

    XMLファイルのコンテンツをロードしています

  19. 19

    テキストファイルの文字エンコードを正しく決定する方法は?

  20. 20

    ファイルアップロードAPI:マルチパート/フォームデータと本文の未加工コンテンツ?

  21. 21

    404 NOT FOUND コンテンツを含むファイルをダウンロードする cURL コマンド

  22. 22

    特定のコンテンツタイプなしでファイルをダウンロードする方法

  23. 23

    テキストファイルのコンテンツをテキスト領域にロードする

  24. 24

    SSHを使用してローカルテキストファイルの文字列をリモートコマンドに安全にパイプする

  25. 25

    Linuxでコンテンツファイルをマルチファイルにコピーする

  26. 26

    json構成ファイルを更新/追加するPythonのコマンドラインツール

  27. 27

    cssファイルが「サーバー」モードで(scssファイルから)正しくインポートされるのに「dist」モードではインポートされないのはなぜですか?(ヨーマン、コンパス)

  28. 28

    ファイルの実際のコンテンツをコピーせずに、ディレクトリ構造、フォルダ、サブフォルダ、ファイルプロパティ、メタデータをコピーする方法は?

  29. 29

    QSHコマンドでプロパティファイルをインポートします-iseries

ホットタグ

アーカイブ