You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Google Drive JavaScript API V2下载文件返回状态0问题咨询

解决Google Drive API V2下载时307重定向导致状态码0的问题

嘿,我碰到过类似的情况,咱们一步步拆解问题:

为什么会出现307重定向?

307 Temporary Redirect在这里的核心原因是Google Drive的动态下载地址机制:

  • 你拿到的downloadUrl其实是一个临时跳转入口,并非直接的文件存储地址。Google会把请求重定向到它的CDN节点,以此优化下载速度和传输安全性。
  • 之前正常现在突然报错,大概率是Google调整了CDN的域名规则,或者你获取到的downloadUrl在发起请求时已经过期(这类临时URL的有效期通常很短)。

而你看到的状态码0,并不是服务器返回的标准状态码——它是浏览器因为跨域安全策略拦截了自动重定向请求导致的:当重定向后的域名和原请求域名不同时,浏览器的XMLHttpRequest会默认中止请求,最终返回状态码0。

怎么处理这个问题?

核心思路是手动接管重定向流程,不要依赖浏览器自动跳转。修改你的下载函数如下:

downloadFile: function (fileItem, callback) {
    var accessToken = gapi.auth.getToken().access_token;

    if (!fileItem.downloadUrl) {
        return callback({ error: { code: "NO_DOWNLOAD_URL", message: "下载URL未指定" } });
    }

    // 封装请求逻辑,支持递归处理重定向
    const sendDownloadRequest = (url) => {
        const xhr = new XMLHttpRequest();
        
        xhr.onerror = () => {
            callback({ error: { code: xhr.status, message: xhr.statusText || "请求被中止" } });
        };

        xhr.open('GET', url, true);
        xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken);
        
        // 注意:如果下载的不是JSON文件,这里要改成对应MIME类型,或者直接删掉这行
        xhr.overrideMimeType("application/json");

        xhr.onreadystatechange = () => {
            const DONE = xhr.DONE || 4;
            if (xhr.readyState !== DONE) return;

            if (xhr.status === 200) {
                return callback(xhr.responseText);
            }

            // 处理307/302重定向
            if ([307, 302].includes(xhr.status)) {
                const redirectUrl = xhr.getResponseHeader('Location');
                if (redirectUrl) {
                    return sendDownloadRequest(redirectUrl);
                }
                return callback({ error: { code: xhr.status, message: "重定向地址为空" } });
            }

            // 其他错误情况
            callback({ error: { code: xhr.status, message: xhr.statusText } });
        };

        xhr.send();
    };

    // 发起初始请求
    sendDownloadRequest(fileItem.downloadUrl);
}

额外要检查的几个点

  • MIME类型适配:你代码里硬写了application/json,如果下载的是其他类型文件(比如图片、文档),这会导致解析失败,建议换成fileItem.mimeType或者直接移除这行。
  • CORS配置:去Google Cloud控制台的API密钥设置里,确保你的应用域名(包括可能的本地开发域名)已经添加到允许的来源列表,同时可以把*.googleusercontent.com也加上,覆盖CDN的域名。
  • Token权限:确认你的access token拥有drive.readonly或者更高的权限,权限不足会导致重定向后的请求被拒绝。

内容的提问来源于stack exchange,提问作者Ian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 16:42:37