2

Google ドライブのテキスト ファイルのメタ データをダウンロードできますが、XMLHttpRequest (XMLHttpRequest.status = 0) を介して webContentLink にアクセスできません。ただし、同じ webContentLink url を使用した window.open(url) 呼び出しは正常に機能します。CORS が webContentLink に対して有効になっていないようです。

var clientId = '00000000000000';
var apiKey = 'AAAAAAAAAAAAAAAAAA';
var scopes = 'https://www.googleapis.com/auth/drive';

function loadDoc(url) {
    //window.open(url);
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    xmlhttp.onreadystatechange = function() {
        alert("readyState = " + xmlhttp.readyState + " status = " + xmlhttp.status);
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            //... do something
        }
    }
    xmlhttp.open("GET", url, true);
    var myToken = gapi.auth.getToken();
    xmlhttp.setRequestHeader("Referer", "http://mydomain");
    xmlhttp.setRequestHeader("Accept", "text/x-tex");
    xmlhttp.setRequestHeader("Content-Type", "text/x-tex");
    xmlhttp.responseType = 'arraybuffer';
    xmlhttp.overrideMimeType("text/plain");
    xmlhttp.setRequestHeader('Authorization', 'Bearer ' + myToken.access_token);
    xmlhttp.send();
}

function loadMetaData(url) {
    xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            var metaData = xmlhttp.responseText;
            var index = metaData.search('"webContentLink"');
            if (index != -1) {
                var i1 = metaData.indexOf('"', index + 17);
                var i2 = metaData.indexOf('"', i1 + 1);
                var fileName = metaData.slice(i1 + 1, i2);
                loadDoc(fileName);
            }
        }
    }
    xmlhttp.open("GET", url, true);
    var myToken = gapi.auth.getToken();
    xmlhttp.setRequestHeader('Authorization', 'Bearer ' + myToken.access_token);
    xmlhttp.send();
}

// A simple callback implementation.
function pickerCallback(data) {
    if (data.action == google.picker.Action.PICKED) {
        var fileId = data.docs[0].id;
        var url = 'https://www.googleapis.com/drive/v2/files/' + fileId;
        loadMetaData(url);
    }
}

したがって、関数 loadMetaData(url) は正常に機能しますが、関数 loadDoc(url) は機能しません。これは、CORS が webContentLink に設定されていないことが原因であるというのは正しいですか? また、これが将来変更される可能性はありますか?

ありがとう、ダニー

4

2 に答える 2

4

XHR を介してファイルをダウンロードする場合は、downloadUrl代わりに を使用し、既に行っているようにアクセス トークンをAuthorizationヘッダーとして提供する必要があります。

webContentLinkCookie 認証のみをサポートし、XHR から取得すると失敗する可能性があります。

于 2012-08-08T16:05:40.923 に答える
3

編集:グーグルAPIが変更され、最近追加したoauthTokenが必要です。

解決しました!アランに感謝します。以下に正しいコードを示します。実用的な例はここにあります。

var clientId = '1234567890';
var scopes = 'https://www.googleapis.com/auth/drive';
var oauthToken;

function getData(url, callback) {
    xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            callback(xmlhttp.responseText);
        }
    }
    xmlhttp.open('GET', url, true);
    var myToken = gapi.auth.getToken();
    xmlhttp.setRequestHeader('Authorization', 'Bearer ' + myToken.access_token);
    xmlhttp.send();
}

// Create and render a Picker object
function createPicker() {
    var picker = new google.picker.PickerBuilder()
        .setAppId(clientId)
        .setOAuthToken(oauthToken)
        .addView(google.picker.ViewId.DOCS)
        .setCallback(pickerCallback)
        .build();
    picker.setVisible(true);
}

// A simple callback implementation.
function pickerCallback(data) {
    if (data.action == google.picker.Action.PICKED) {
        var fileId = data.docs[0].id;
        var url = 'https://www.googleapis.com/drive/v2/files/' + fileId;
        getData(url, function(responseText) {
            var metaData = JSON.parse(responseText);
            getData(metaData.downloadUrl, function(text) {
                //Do something with text...
            });
        });
    }
}
于 2012-08-10T08:53:14.527 に答える