JQuery.Formプラグイン経由でfile
フィールドを含むフォームを送信しようとしています。コードは次のとおりです。
$('form').ajaxSubmit({
url: "/path",
dataType: "json",
contentType: "multipart/form-data"
...
サーバーはjsonを応答として返します。 IEを除くすべてのブラウザーで問題なく動作します。IEは、応答をファイルとしてダウンロードしようとします。フォームからファイルフィールドを削除すると、問題なく動作します。
こことGoogleでさまざまなソリューションを見てきましたが、jQueryを介してフォームのenctype
を設定するなど、基本的に説明したほとんどすべてを試しましたが、うまくいきませんでした。
どんな提案も大歓迎です。
これに対する直接的な解決策は見つかりませんでしたが、最終的に次の回避策を実装しました:私のajax設定で_dataType: "text"
_を使用し、コントローラからプレーンテキストを返し、値を_;
_およびそれらをクライアント側で解析します。そのようにIEとForefoxは応答をダウンロードしようとして停止しました。
私は、平文を返す以外に、上記の動作を防ぐ他の方法を見つけませんでした。 JSONをプレーンテキストとして返し、$。parseJSONで解析しようとしましたが、jsエラーが原因で機能しませんでした。
コントローラからJSONを「text/html」として単純に返し、JQuery.parseJSON()を使用してクライアント側でJSONを解析できます。
コントローラ:
return this.Json(
new
{
prop1 = 5,
prop2 = 10
},
"text/html");
クライアント側:
jsonResponse = $.parseJSON(response);
if(jsonResponse.prop1==5) {
...
}
このソリューションは私のために働いています。
'Content-Type', 'text/html'
ヘッダーを含む応答を送信するだけです。
あなたと同じ状況:問題は、$(form).ajaxSubmit(...)
関数で使用される_enctype="multipart/form-data"
_フォームでのみ発生します。
私のチームと私は(この関数で)_dataType: 'json'
_オプションを_dataType: 'text'
_に置き換え、responseText = $.parseJSON(responseText);
を追加してサーバー応答の解析を強制する必要がありました。
もちろん、_"text/plain"
_の代わりに_"application/json"
_ヘッダーで応答を返すためにサーバー側にステップインする必要がありました
私たちはそれを誇りに思っていません:( IEは間違いなくすべてを殺している...
私はzmontecaから与えられたアドバイスを試みませんでした(すでに時間をかけすぎていました)が、それは価値があるようです。
それが役に立てば幸い!
Content-Type: text/html
を設定するだけです
これは、IE8がapplication/...
mimetypeを認識しないために発生します。これは私のために働く。
それが役に立てば幸い。
zendを使用している場合、次のことができます。
$this->getResponse()->setHeader('Content-Type', 'text/html');
コントローラーのアクションで。クライアント側では、jQueryの場合、次のことができます。
data = $.parseJSON(data);
Zend Frameworkで次の回避策を思いつきました。
if (!$this->_request->isXmlHttpRequest()) {
die('<textarea>'.Zend_Json::encode($data).'</textarea>');
}
$this->view->assign($data);
サーバーがJSONを文字列として返すようにすることで、問題を解決できるようです。次に、completeイベント内でJSON.parse()を使用しました。