Je tente donc d'obtenir une barre de progression sur les téléchargements de fichiers sur mon site. Si je télécharge simplement la ressource
$.ajax({
url: $rootScope.URL, //Server script to process data
type: 'POST',
beforeSend: beforeSendHandler,
success: completeHandler,
error: errorHandler,
data: formData,
cache: false,
contentType: false,
processData: false
});
Cela fonctionne parfaitement, cependant si j'ajoute l'événement pour écouter les progrès:
$.ajax({
url: $rootScope.URL, //Server script to process data
type: 'POST',
xhr: function() { // Custom XMLHttpRequest
var myXhr = $.ajaxSettings.xhr();
if(myXhr.upload){ // Check if upload property exists
myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // For handling the progress of the upload
}
return myXhr;
},
beforeSend: beforeSendHandler,
success: completeHandler,
error: errorHandler,
data: formData,
cache: false,
contentType: false,
processData: false
});
Je reçois:
OPTIONS myserver.com/controller/filtercontroller.php? 405 (Method Not Allowed)
jQuery.ajaxTransport.send
jQuery.extend.ajax
(anonymous function)
jQuery.event.dispatch
jQuery.event.add.elemData.handle
XMLHttpRequest cannot load myserver.com/controller/filtercontroller.php?. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access. The response had HTTP status code 405.
Donc, évidemment, mon serveur n'a pas Access-Control-Allow-Origin
et OPTIONS
right? Mais les 2 premières lignes de filtercontroller.php
sont:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
J'ai essayé plusieurs solutions différentes et aucune n'a fonctionné pour moi.
Tout d’abord, j’estime que cela n’a rien à voir avec votre configuration CORS, car cela produirait des erreurs différentes. En examinant les causes possibles de l'erreur que vous recevez dans le contexte Azure/IIS, j'ai découvert les possibilités suivantes:
<remove name="OPTIONSVerbHandler" />
explicite dans votre fichier web.config
. (Ceci est la valeur par défaut dans certains cas).<remove name="WebDAVModule"/>
Enfin, je viens de trouver cette réponse qui pourrait offrir différentes solutions dans lesquelles vous ne définissez pas les en-têtes CORS dans votre fichier PHP, mais plutôt dans la configuration du serveur.
La header()
doit être placée avant TOUT résultat envoyé au navigateur. Une fois la sortie envoyée au navigateur, la header()
émettra en réalité un avertissement PHP qui, si vous ne le voyez pas, n'est ni affiché ni suivi.
Vous pouvez également le faire via .htaccess, qui serait traité avant l’un de vos scripts PHP. Cela se passe sur la supposition que vous utilisez Apache pour votre serveur web.
Header set Access-Control-Allow-Origin "*"
# below line shouldn't be needed as by default all of those are allowed,
# if you were doing PUT, TRACE, DELETE, etc then you would need it
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"