javascript - 谷歌驱动器 : access webContentLink through javascript

标签 javascript google-drive-api

我可以在 Google 云端硬盘上下载文本文件的元数据,但无法通过 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 造成的,这是否有可能在未来发生变化?

谢谢, 丹尼

最佳答案

如果通过 XHR 下载文件,您应该改用 downloadUrl 并提供访问 token 作为 Authorization header ,就像您已经在做的那样。

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

关于javascript - 谷歌驱动器 : access webContentLink through javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11864657/

相关文章:

javascript - jQuery 动画函数的愚蠢问题

Javascript - 提交表单错误

google-chrome - Google云端硬盘离线文档文件位置

google-sheets - 仅当其他单元格符合 Google 电子表格中的特定条件时,如何添加数字?

google-apps-script - 如何使用 Google Apps 脚本搜索文件夹

google-apps-script - 将文件夹中所有可用的 xls 文件转换为 "Google Doc Spreadsheets"?

javascript - 加快客户端的数据表加载时间

javascript - 响应式 Canvas vuejs

javascript - 仅将样式应用于元素映射中的一个元素

java - Google 云端硬盘 session 到期