0

J'utilise le code suivant pour télécharger un fichier volumineux (mais inférieur à 62 Mo) vers OneDrive à l'aide de l'API Microsoft Graph.API XMLHttpRequest to Microsoft Graph abandonnée dans IE 11

let req = new XMLHttpRequest(); 
req.open("PUT", url, true); 
req.setRequestHeader("Authorization", "Bearer " + this.authProvider.tokens.graph); 
req.setRequestHeader("Content-Length", file.size.toString()); 
req.setRequestHeader("Content-Range", "bytes 0-" + (file.size - 1).toString() + "/" + file.size.toString()); 
req.upload.onprogress = (e) => { 
    let progress = Math.floor(e.loaded/e.total * 100); 
    console.log(progress); 
}; 
req.upload.onerror = (e: any) => { 
    console.log("error"); 
}; 
req.onload = (e) => { 
    console.log("done"); 
}; 
req.send(buffer); 

Cela va par l'amende de Chrome (dernière version à ce jour), mais après la création de la session, le téléchargement échoue sur l'url de retour de la demande create session. Je reçois l'erreur SCRIPT7002: XMLHttpRequest: Network Error 0x80070005, Access is denied. dans la console IE 11 et dans l'onglet réseau, je vois l'état de la demande étant aborted et l'initiateur était une demande CORS Preflight. Selon d'autres tests, je pense que l'erreur provient de req.open("PUT", url, true); ligne.

-Update-

Sa fait la demande CORS prévol (OPTIONS) à l'URL de retour qui est en fait un échec qui obtient par Chrome très bien.

Répondre

1

Le problème pourrait être que vous configurez l'en-tête Content-Length. Vous ne devez pas définir explicitement cet en-tête ici (et dans tous les cas, il ne s'agira que de la longueur de la requête en cours, pas de la longueur du fichier entier).

Bien que cela semble arbitraire, j'ai une théorie quant à ce qui se passe, mais je ne suis pas en mesure de le tester en ce moment. Ma théorie est que IE échoue le contrôle en amont de CORS parce que le serveur n'annonce pas explicitement Content-Length comme un en-tête autorisé (parce que c'est dans l'ensemble des en-têtes par défaut qui sont toujours autorisés). IE effectue probablement une vérification explicite des en-têtes que vous essayez d'envoyer par rapport à ce que le contrôle en amont CORS a renvoyé dans sa liste d'autorisations.

Vous devez arrêter de définir l'en-tête Content-Length indépendamment, et nous espérons que cela résout également votre problème. Si non, laissez-moi savoir et je vais creuser plus.

+0

Non. Cela ne résout pas le problème. – lbrahim

-2

Cela peut poser un problème avec les demandes inter-domaines. J'ai eu ce problème il n'y a pas longtemps et j'ai réussi à le résoudre en utilisant JQuery à la place.
Inclure le ci-dessous dans vos <head> balises

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> 
<script src="YourScriptNameHere.js" type="text/javascript"></script> 

puis dans votre fichier JavaScript:

$(function() { 
    $.ajax({ 
     type: "PUT" 
     , url: "File.xml" 
     , dataType: "xml" 
     , success: parseXml 
    }); 
    function parseXml(xml) { 
     //Your code here 
    } 
}); 
+0

Le code fonctionne sur Chrome mais pas IE 11. En outre, essayé avec jquery toujours la même erreur. – lbrahim