Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
google drive:通过javascript访问WebContent链接_Javascript_Google Drive Api - Fatal编程技术网

google drive:通过javascript访问WebContent链接

google drive:通过javascript访问WebContent链接,javascript,google-drive-api,Javascript,Google Drive Api,我可以在Google Drive上下载文本文件的元数据,但无法通过XMLHttpRequest(XMLHttpRequest.status=0)访问webContentLink。不过,使用相同的webContentLink url调用window.open(url)效果很好。似乎没有为webContentLink启用CORS var clientId = '00000000000000'; var apiKey = 'AAAAAAAAAAAAAAAAAA'; var scopes = 'http

我可以在Google Drive上下载文本文件的元数据,但无法通过XMLHttpRequest(XMLHttpRequest.status=0)访问webContentLink。不过,使用相同的webContentLink url调用window.open(url)效果很好。似乎没有为webContentLink启用CORS

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)不能。这是因为没有为webContentLink设置CORS,我说的对吗?这是否有可能在将来被更改

谢谢,
Danny

如果通过XHR下载文件,则应使用
下载URL
,并提供访问令牌作为
授权
头,就像您已经做的那样


webContentLink
仅支持cookie身份验证,从XHR检索时可能会失败。

编辑:google api已经更改,现在需要oauthToken,我已经添加了它

解决了!幸亏下面您可以找到正确的代码。可以找到一个工作示例


这也不起作用(XMLHttpRequest.status=0),但现在window.open(url)也会生成一个空窗口。您是否尝试过使用与
loadMetaData
相同的XHR逻辑,但使用
downloadUrl
。此外,您应该使用
JSON.parse(metaData)
将JSON对象解析为JS对象,而不是使用字符串操作来检索属性。这确实解决了问题。非常感谢,阿兰。我将在下面为遇到相同问题的任何人发布我的工作代码。我已经在硬盘上挣扎了好几天。这是黄金信息。你从哪里得到我的代币?这不是oauthToken吗?编辑没有关系。我看到了。myToken=gapi.auth.getToken()
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...
            });
        });
    }
}