使用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
相关产品推荐
相关产品推荐

