web-dev-qa-db-ja.com

IEは、ファイルを含むjQueryマルチパートフォームデータの送信中にjson応答をダウンロードしようとします

JQuery.Formプラグイン経由でfileフィールドを含むフォームを送信しようとしています。コードは次のとおりです。

$('form').ajaxSubmit({
  url: "/path",
  dataType: "json",
  contentType: "multipart/form-data"
...

サーバーはjsonを応答として返します。 IEを除くすべてのブラウザーで問題なく動作します。IEは、応答をファイルとしてダウンロードしようとします。フォームからファイルフィールドを削除すると、問題なく動作します。

こことGoogleでさまざまなソリューションを見てきましたが、jQueryを介してフォームのenctypeを設定するなど、基本的に説明したほとんどすべてを試しましたが、うまくいきませんでした。

どんな提案も大歓迎です。

39
snitko

これに対する直接的な解決策は見つかりませんでしたが、最終的に次の回避策を実装しました:私のajax設定で_dataType: "text"_を使用し、コントローラからプレーンテキストを返し、値を_;_およびそれらをクライアント側で解析します。そのようにIEとForefoxは応答をダウンロードしようとして停止しました。

私は、平文を返す以外に、上記の動作を防ぐ他の方法を見つけませんでした。 JSONをプレーンテキストとして返し、$。parseJSONで解析しようとしましたが、jsエラーが原因で機能しませんでした。

10
snitko

コントローラからJSONを「text/html」として単純に返し、JQuery.parseJSON()を使用してクライアント側でJSONを解析できます。

コントローラ:

    return this.Json(
            new
                {
                    prop1 = 5,
                    prop2 = 10
                }, 
            "text/html");

クライアント側:

jsonResponse = $.parseJSON(response);

if(jsonResponse.prop1==5) {
     ...
}

このソリューションは私のために働いています。

21
Dmitrii

'Content-Type', 'text/html'ヘッダーを含む応答を送信するだけです。

6
Sannek8552

あなたと同じ状況:問題は、$(form).ajaxSubmit(...)関数で使用される_enctype="multipart/form-data"_フォームでのみ発生します。

私のチームと私は(この関数で)_dataType: 'json'_オプションを_dataType: 'text'_に置き換え、responseText = $.parseJSON(responseText);を追加してサーバー応答の解析を強制する必要がありました。

もちろん、_"text/plain"_の代わりに_"application/json"_ヘッダーで応答を返すためにサーバー側にステップインする必要がありました

私たちはそれを誇りに思っていません:( IEは間違いなくすべてを殺している...

私はzmontecaから与えられたアドバイスを試みませんでした(すでに時間をかけすぎていました)が、それは価値があるようです。

それが役に立てば幸い!

2
lboix

Content-Type: text/htmlを設定するだけです

これは、IE8がapplication/... mimetypeを認識しないために発生します。これは私のために働く。

それが役に立てば幸い。

2
devilmark84

zendを使用している場合、次のことができます。

$this->getResponse()->setHeader('Content-Type', 'text/html');

コントローラーのアクションで。クライアント側では、jQueryの場合、次のことができます。

data = $.parseJSON(data);
1
Vanya

Zend Frameworkで次の回避策を思いつきました。

if (!$this->_request->isXmlHttpRequest()) {
    die('<textarea>'.Zend_Json::encode($data).'</textarea>');
}
$this->view->assign($data);
0
sroes

このサイトには、応答を http://forum.jquery.com/topic/jquery-form-malsup-ie7-file-download-security-warning-on-ajax-file-uploadにラップすることに関する情報があります。

サーバーがJSONを文字列として返すようにすることで、問題を解決できるようです。次に、completeイベント内でJSON.parse()を使用しました。

0
keza