web-dev-qa-db-fra.com

IE essaie de télécharger la réponse json lors de la soumission de données de formulaire multipart jQuery contenant un fichier

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.

39
snitko

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.

10
snitko

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.

21
Dmitrii

Il suffit d'envoyer la réponse avec l'en-tête 'Content-Type', 'text/html'.

6
Sannek8552

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!

2
lboix

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.

2
devilmark84

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);
1
Vanya

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);
0
sroes

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.

0
keza