Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Контроллер:

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

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

jsonResponse = $.parseJSON(response);

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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

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

Ответ 6

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

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

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

data = $.parseJSON(data);

Ответ 8

Я применил следующее обходное решение (в Zend Framework):

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

Ответ 9

Удаление ContentType из serveride работает для меня.