3

私はmultipart/form-data次のJavaScriptとjQueryで送信しようとしています:

var formData = new FormData();

formData.append("projectName", $("#projectNameInput").val());

var file = $("#fileInput")[0].files[0];
formData.append("content", file);

var xhr = new XMLHttpRequest();
xhr.open('POST', '/project', true);
xhr.onload = function(ev) {
  // Handling logic omitted
};
xhr.send(formData);

ただし、一部のクライアントブラウザ(FirefoxおよびChrome)400 Bad Requestはサーバーから受信します。ヘッダーとリクエストペイロードを調べていると、一部のブラウザがファイルの明示的なコンテンツタイプを次のように設定していることがわかりました。

------WebKitFormBoundaryEuDIpEU2Ci8VNwNJ 
Content-Disposition: form-data; name="content"; filename="testfile.ext" 
Content-Type: EXT Project Data (64bit)

------WebKitFormBoundaryEuDIpEU2Ci8VNwNJ

作業中のリクエストではContent-Type、次のようにする必要がContent-Type: application/octet-streamあります。サーバーが適切に処理できる。

これは、ブラウザーの構成またはファイルの関連付けに関係していると思われます。リクエストのファイル部分のコンテンツタイプを明示的に設定する方法はありますか?

この問題は、FirefoxとChromeを使用している一部のユーザーで発生します。ただし、一部のユーザーはChromeとFirefoxを使用して正常にアップロードできます。IEはアプリケーションでサポートされていません。

4

1 に答える 1

4

わかりました、私たちはこの問題を理解することができました。クライアント システムに登録されたコンテンツ タイプは、特定のサードパーティ アプリケーションがインストールされている一部のクライアント マシンで、実際には不正な形式であることが判明しました。

パーツのコンテンツ タイプ ブラウザー セットをプログラムで変更することはできません。Michael-O が指摘したように、常にIANAに登録されたコンテンツ タイプを使用する必要があります。ここに標準へのリンクがあります。

この場合、不正なコンテンツ タイプをクライアントのシステムに登録したのは、サードパーティ ソフトウェアでした。コンテンツ タイプに空白を含めることはできないため、コンテンツ タイプEXT Project Dataは明らかに違法です。登録されたコンテンツ タイプをカスタム コンテンツタイプに変更することで、この問題を修正しました。したがって、現在使用しているコンテンツ タイプはapplication/x-ext-project-dataであり、サーバー側で適切に処理されます。

于 2012-07-20T07:18:36.687 に答える