J'essaie de soumettre un formulaire avec un champ file
dans celui-ci via le plugin jQuery.Form, voici le code:
$('form').ajaxSubmit({
url: "/path",
dataType: "json",
contentType: "multipart/form-data"
...
Le serveur renvoie ensuite JSON en réponse. Fonctionne très bien dans tous les navigateurs sauf IE, qui tente de télécharger la réponse sous forme de fichier. Si je supprime le champ de fichier du formulaire, cela fonctionne également très bien.
J'ai vu diverses solutions ici et sur Google et, en gros, essayé presque tout, y compris la définition de enctype
pour le formulaire via jQuery, mais cela n'a pas fonctionné.
Toutes les suggestions seraient les bienvenues.
Je n'ai pas trouvé de solution directe à ce problème, mais j'ai finalement mis en place la solution suivante: J'ai utilisé dataType: "text"
dans mes paramètres ajax, puis renvoyé le texte en clair depuis le contrôleur, en séparant les valeurs avec ;
et en les analysant côté client . De cette façon, IE et Forefox ont cessé d'essayer de télécharger une réponse.
Je n'ai pas trouvé d'autre moyen d'empêcher ledit comportement que de retourner un texte en clair. J'ai essayé de retourner JSON en texte brut, puis de l’analyser avec $ .parseJSON, mais cela n’a pas fonctionné en raison de quelques erreurs js.
Vous pouvez simplement renvoyer JSON à partir du contrôleur en tant que "text/html", puis l'analyser côté client à l'aide de JQuery.parseJSON ().
Manette:
return this.Json(
new
{
prop1 = 5,
prop2 = 10
},
"text/html");
Côté client:
jsonResponse = $.parseJSON(response);
if(jsonResponse.prop1==5) {
...
}
Cette solution a fonctionné pour moi.
Il suffit d'envoyer la réponse avec l'en-tête 'Content-Type', 'text/html'
.
Même situation que vous: le problème ne survient qu'avec le formulaire enctype="multipart/form-data"
utilisé avec la fonction $(form).ajaxSubmit(...)
.
Mon équipe et moi-même avons dû remplacer (dans cette fonction) l'option dataType: 'json'
par dataType: 'text'
et ajouter responseText = $.parseJSON(responseText);
pour forcer l'analyse de la réponse du serveur.
Bien sûr, nous avons également dû intervenir côté serveur pour renvoyer une réponse avec l'en-tête "text/plain"
au lieu de "application/json"
Nous n'en sommes pas fiers :( IE est définitivement en train de tout tuer ...
Je n’ai pas suivi les conseils de zmonteca (qui y avait déjà passé trop de temps), mais cela semble digne d’être: dites-nous s’il vous convenait.
J'espère que ça aide!
Il suffit de définir Content-Type: text/html
Cela est dû au fait que IE8 ne reconnaît pas application/...
mimetype .Cela fonctionne pour moi.
J'espère que ça aide.
si vous travaillez avec Zend, vous pouvez le faire
$this->getResponse()->setHeader('Content-Type', 'text/html');
dans votre action de contrôleur. et côté client, en cas de jQuery, vous pouvez faire
data = $.parseJSON(data);
J'ai mis au point la solution suivante (dans Zend Framework):
if (!$this->_request->isXmlHttpRequest()) {
die('<textarea>'.Zend_Json::encode($data).'</textarea>');
}
$this->view->assign($data);
Ce site contient des informations sur l’envoi de la réponse dans un fichier http://forum.jquery.com/topic/jquery-form-malsup-ie7-file-download-security-warning-on-ajax-file- télécharger
Il me semblait que je pouvais résoudre mon problème en obligeant mon serveur à renvoyer le JSON sous la forme d'une chaîne . Ensuite, j'ai utilisé JSON.parse () dans l'événement complete.