IE пытается загрузить json-ответ при отправке данных многокомпонентной формы jQuery, содержащей файл
Я пытаюсь отправить форму с полем file
в нее через плагин jQuery.Form, вот код:
$('form').ajaxSubmit({
url: "/path",
dataType: "json",
contentType: "multipart/form-data"
...
Затем сервер возвращает json в качестве ответа. Отлично работает во всех браузерах, кроме IE, который пытается загрузить ответ в виде файла. Если я удаляю поле файла из формы, оно также отлично работает.
Я видел различные решения здесь и в Google и в основном пытался почти все описано, включая установку enctype
для формы через jQuery, но это не сработало.
Любые предложения будут очень приветствоваться.
Ответы
Ответ 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);
Ответ 7
На этом сайте есть информация об обертывании ответа в
http://forum.jquery.com/topic/jquery-form-malsup-ie7-file-download-security-warning-on-ajax-file-upload
Кажется, я смог исправить свою проблему, заставив мой сервер вернуть JSON в виде строки.
Затем я использовал JSON.parse() внутри полного события.
Ответ 8
Я применил следующее обходное решение (в Zend Framework):
if (!$this->_request->isXmlHttpRequest()) {
die('<textarea>'.Zend_Json::encode($data).'</textarea>');
}
$this->view->assign($data);
Ответ 9
Удаление ContentType из serveride работает для меня.