IE пытается загрузить ответ json при отправке данных составной формы jQuery, содержащих файл - PullRequest
39 голосов
/ 16 ноября 2011

Я пытаюсь отправить форму с полем file через плагин jQuery.Form, вот код:

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

Затем сервер возвращает json в качестве ответа.Прекрасно работает во всех браузерах, кроме IE, который пытается загрузить ответ в виде файла.Если я удалю поле файла из формы, оно также будет работать нормально.

Я видел различные решения здесь и в Google и в основном перепробовал почти все, что описано, включая настройку enctype для формы через jQueryно это не сработало.

Любые предложения будут приветствоваться.

Ответы [ 9 ]

21 голосов
/ 29 сентября 2012

Вы можете просто вернуть JSON из контроллера как «text / html», а затем проанализировать его на стороне клиента с помощью JQuery.parseJSON ().

Контроллер:

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

Клиентсторона:

jsonResponse = $.parseJSON(response);

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

Это решение работает для меня.

10 голосов
/ 19 ноября 2011

Я не нашел прямого решения для этого, но в итоге я применил следующий обходной путь: Я использовал dataType: "text" в своих настройках AJAX, а затем возвратил открытый текст из контроллера, отделив значения с помощью ; и проанализировав их клиентская сторона . Таким образом, IE и Forefox перестали пытаться загрузить ответ.

Я не нашел другого способа предотвратить указанное поведение, кроме как вернуть открытый текст. Я попытался вернуть JSON в виде открытого текста, а затем проанализировать его с помощью $ .parseJSON, но он не работал из-за некоторых ошибок js.

6 голосов
/ 17 декабря 2012

Просто отправьте ответ с заголовком 'Content-Type', 'text/html'.

2 голосов
/ 16 апреля 2014

Та же ситуация, что и у вас: проблема возникает только с формой enctype="multipart/form-data", используемой с функцией $(form).ajaxSubmit(...).

Моя команда и я должны были заменить (в этой функции) параметр dataType: 'json' на dataType: 'text' и добавить responseText = $.parseJSON(responseText); для принудительного анализа ответа сервера.

Конечно, нам также пришлось перейти на серверную сторону, чтобы вернуть ответ с заголовком "text/plain" вместо "application/json"

Мы не гордимся этим :( IE определенно убивает все ...

Я не испробовал совет, данный zmonteca (уже потратил на него слишком много времени), но он, кажется, заслуживает внимания: дайте нам знать, если это для вас нормально.

Надеюсь, это поможет!

2 голосов
/ 11 марта 2014

Просто установите Content-Type: text/html

Это происходит потому, что IE8 не распознает application/... mimetype. Это работает для меня.

Надеюсь, это поможет.

1 голос
/ 09 мая 2012

если вы работаете с Zend, вы можете сделать

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

в действии вашего контроллера.и на стороне клиента, в случае jQuery, вы можете сделать

data = $.parseJSON(data);
0 голосов
/ 17 октября 2014

Удаление ContentType со стороны сервера работает для меня.

0 голосов
/ 25 июня 2012

Я нашел следующий обходной путь (в Zend Framework):

if (!$this->_request->isXmlHttpRequest()) {
    die('<textarea>'.Zend_Json::encode($data).'</textarea>');
}
$this->view->assign($data);
0 голосов
/ 02 мая 2012

На этом сайте есть информация об упаковке ответа в http://forum.jquery.com/topic/jquery-form-malsup-ie7-file-download-security-warning-on-ajax-file-upload

Кажется, я смог решить мою проблему, заставив мой сервер возвращать JSON в виде строки. Затем я использовал JSON.parse () внутри завершенного события.

...