Être "400 Bad Request" lors de l'utilisation de " multipart/form-data comme Type de Contenu dans XHR
J'ai une requête AJAX qui envoie des données. Les données respecte la multipart/form-data spécification.
Le problème que je me pose, c'est que le navigateur définit l'entête Content-Type text/plain et il devrait être multipart/form-data.
J'ai essayé de faire ceci: request.setRequestHeader("Content-Type", "multipart/form-data");
mais cela donne une 400 Bad Request error.
Si je ne request.setRequestHeader("Content-Typexxxx", "multipart/form-data");
il n'y a pas d'erreur, le "Contenu-Typexxxx" en-tête est défini, mais il est évident qu'elle n'est d'aucune aide pour moi.
Je pense qu'il y a une liste de validité-têtes Content-Type, on peut définir et de "multipart/form-data" n'est pas parmi eux, mais je ne peux pas trouver une solution à ma situation.
Échantillon de données en cours d'expédition:
Content-Type: multipart/form-data; boundary=l3iPy71otz --l3iPy71otz Content-Disposition: form-data; name="titluPublic" Variation_1 --l3iPy71otz Content-Disposition: form-data; name="nr_versiune" --l3iPy71otz--
Merci!
- Je pense (espère) que Comment créer une requête AJAX avec JavaScript qui contient les fichiers et les données post pourrait être utile. Sinon, merci de poster votre code.
- J'ai lu la documentation et je suis sûr que la demande est valide, je ne peux pas définir la
Content-Type
àmultipart/form-data
. Malheureusement, les autres postes ne brille pas toute la lumière sur mon problème.
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas configuré l'
boundary
dans votre en-tête de requête, comme dans:Pour plus d'informations, voir RFC 2045:
Mise à jour: un Autre problème, j'ai trouvé sur le net apparaît lorsqu'un
charset
est ajouté à laContent-type
dans l'entête de la requête, mais pas dans les limites de message dans le corps (c'est également vrai pour votre cas de test). Il ne semble pas probable solution, mais peut-être que ça aide.Dans votre cas, ajouter explicitement une
charset
à la fois l'en-tête de demande et dans les limites de messages:Mise à jour 2: Après avoir essayé moi-même en local, j'ai remarqué que le leader de la frontière n'a pas été reconnu en tant que tel, mais interprété comme le dernier paramètre de contenu (sur mon plus indulgent serveur). Peut-être à cause d'Apache pour lancer une
400 Bad Request
erreur.Après quelques essais et erreurs, j'ai remarqué que cela a été causé parce que le serveur attend la
charset
être dans chaque limite, même le dernier. Pour éviter toute confusion, j'ai décidé de définir explicitement lacharset
dans l'en-tête de demande avant le paramètre de limite, de sorte que la frontière serait le dernier paramètre dans leContent-type
- tête de la demande. Après cela, tout semblait aller bien.Content-length
à8000
? Autant que je sache, vous ne devriez vraiment pas faire ça.[23/Jan/2011:01:13:53 +0200] "POST /florin2/request.php?action=produsUpdate&id=24556 HTTP/1.1" 404 - "http://clienti.bsorin.ro/florin2/cautare" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13"
$_POST
variables dans votre serveur de script côté?[Sun Jan 23 16:35:05 2011] [error] File does not exist: /home/soinro/!!clienti/400.shtml, referer: http://clienti.bsorin.ro/florin2/cautare
. J'ai également laissé de côté les paramètres de l'URL, mais cela ne changera rienmultipart/form-data
de toute façon, au lieu de s'en tenir à la valeur par défautapplication/x-www-form-urlencoded
des données de formulaire, où il est beaucoup plus facile de construire le POSTE de données (seulement n'oubliez pas d'utiliserencodeURIComponent
).echo '$_SERVER[CONTENT_TYPE]='.$_SERVER['CONTENT_TYPE'].'<br /><br />'; echo '<pre>'.file_get_contents('php://input').'</pre>'; debug($_POST);
oùdebug()
est juste une plus bellevar_dump();
x-www-form-urlencode
solution pour le moment car je dois finir ce travail. Peut-être à un certain point, je vais revenir pour comprendre cela et si je le fais, je vais être sûr de poster la solution ici. Merci encore!