2012-11-17 6 views
7

Ich habe mir den Kopf zerbrochen, um herauszufinden, wie man eine Datei von Drive in Internet Explorer herunterladen kann. Es scheint, dass Cross-Domain-Sicherheitsbedenken dies verhindern.Google Drive und CORS-Cross-Domain-Anfragen

Ein einfaches 'GET' XMLHttpRequest mit funktioniert in Chrome und Firefox, weil es Request-Header unterstützt, mit denen der Browser eine CORS Antwort verlangen, wie sie in den folgenden Codezeilen gezeigt:

var xhr = new XMLHttpRequest(); 
    xhr.open('GET', file.downloadUrl); 
    xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken); 
    xhr.onload = function() { 
     callback(xhr.responseText); 
    }; 
    xhr.send(); 

IE unterstützt die Anforderungsheader nicht, angeblich aus Sicherheitsgründen. Da ich in diesem leider sehr beliebten Browser keine Inhalte herunterladen kann, bleibe ich völlig hängen.

Meine Frage ist diese - wie in der Welt sind diese anderen Anwendungen, die sich mit diesem Problem befassen? Verwenden sie einen serverseitigen Proxy irgendeiner Art und leiten alle Laufwerkanforderungen über ihr eigenes Back-End weiter? Das scheint an diesem Punkt eher beschwerlich. Oder gibt es eine Möglichkeit, auf die Laufwerksdatei beim Start zuzugreifen, die mir nicht bekannt ist?

Ich habe einige Lösungen gesehen, die Dateien auf beiden Servern erfordern, die soweit ich weiß, keine Option darstellen. Hat Google Drive die Möglichkeit, mit CORS ohne den Anforderungsheader zu antworten, oder gibt es eine andere API, von der ich nicht weiß, dass sie eine Art Rückruf von einem Iframe innerhalb der Drive-Domäne unterstützt?

Ich bin an diesem Punkt ziemlich tot im Wasser. Irgendwelche Tipps würden sehr geschätzt werden. Entschuldige, dass du irgendwelche Fragen zu MS-Produkten hast.

+0

Haben Sie den JS-Client für die Google Drive-API in Betracht gezogen: http://googleappsdeveloper.blogspot.com/2012/09/introducing-javascript-support-for.html – monsur

+0

Ja, der oben gezeigte Code stammt aus dem Download-Bereich. Es funktioniert hervorragend in Chrome, Firefox und Safari, nur nicht in IE. Ich suchte nach einer alternativen Methode, aber es scheint keine Möglichkeit zu geben, den CORS-Auth-Header innerhalb von IE oder einen Bytebereich-Header (für einen partiellen Download) auszuführen. – djabraham

+0

Hey Dano64, Wenn CORS nicht auf IE arbeiten, wollen wir das beheben. Könnten Sie mir bitte genau mitteilen, was wir am Ende von Google tun müssten, um dies für IE zu beheben? Ich werde dann einen Fehler mit unserem eng Team einreichen und ich werde versuchen, eine schnelle Lösung zu bekommen. – Nivco

Antwort

1

Wenn das Problem ist mit dem IE nicht so dass Sie hinzufügen oder nicht Bestehen der Authorization Header, könnten Sie versuchen, die Access-Token-Passing den access_token URL-Parameter verwenden, die das gleiche Verhalten wie die Authorization Header hat:

var xhr = new XMLHttpRequest(); 
xhr.open('GET', file.downloadUrl + '&access_token=' + accessToken); 
xhr.onload = function() { 
    callback(xhr.responseText); 
}; 
xhr.send(); 
+0

Danke für diesen Vorschlag. Dies funktioniert in Chrome gut. Es wirft immer noch einen Fehler im IE, aber das kann mit der Tatsache zusammenhängen, dass die Website in http läuft und die DownloadUrl immer https ist. Ich werde heute Abend ein Sicherheitszertifikat installieren und es erneut mit einer Testseite versuchen, bei der https aktiviert ist. – djabraham

+0

ERFOLG! Danke für deine Hilfe. Dies funktioniert jetzt gut in IE.Um nur die notwendigen Bedingungen für das Herunterladen eines Google Drive-Artikels in IE zusammenzufassen: 1) verwende XDomainRequest im Gegensatz zu XMLHttpRequest im IE. 2) übergeben Sie den Access Token in der Querystring, wie oben gezeigt. 3) verwenden Sie HTTPS, da das XDomainRequest-Objekt die Kombination mit HTTP nicht zulässt. Weitere Informationen zu den Problemen mit IE8, IE9 und dem kommenden IE10 finden Sie im folgenden Artikel. http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitation-and-workarounds.aspx – djabraham