【问题标题】:Google Drive API cant download file with files.get, request or google request [closed]Google Drive API 无法使用 files.get、request 或 google request 下载文件 [关闭]
【发布时间】:2020-08-27 16:52:55
【问题描述】:

我正在使用客户端 js Google Drive API,但我似乎无法读取/下载之前由相同 api 创建的文本文件。

我在 files/fileID 和 webContentLink url 上尝试了 files.get、手动请求和 google 请求。

webContentLink 如果我在浏览器中打开它但不是通过请求打开它,即使我在浏览器中获得授权(存在 cookie)并在请求中发送令牌(url 和 header)。

fileId
wcLink = webContentLink
oToken = oauthToken

测试1

关于 webContentLink 的 Google 请求

返回 404 未找到

致电https://drive.google.com/static/proxy.html?usegapi=1&jsh=m;//scs/apps-static//js/k=oz.gapi.en.jw7XZHvcak8.O/am=wQE/d=1/ct=zgms/rs=AGLTcCOXtLG11kt9d673FzpjO_GiLUGIQA/m=features

let r = gapi.client.request({
    'path': wcLink,
    'method': 'GET',
    'params': {'fileId': fileId, 'alt': 'media'},
    'headers': {'Authorization': 'Bearer ' + oToken }
})
r.execute((response,rawData)=>{ //callback not called at all
    console.log('resp',response)
    console.log('raw',rawData)
})

测试2

对文件/fileId 的 Google 请求,使用 .execute

返回 200 OK,响应未定义且原始内容为空,内容长度为 0

let r = gapi.client.request({
    'path': 'https://www.googleapis.com/drive/v3/files/'+fileId,
    'method': 'GET',
    'params': {'fileId': fileId, 'alt': 'media'},
    'headers': {'Authorization': 'Bearer ' + oToken }
})
r.execute((response,rawData)=>{
    console.log('resp',response) //undefined
    console.log('raw',rawData) //body:'', content-length:0
})

测试3

drive.files.get on fileId

返回 200 OK,响应结果:false,正文:''

gapi.client.drive.files.get({
    'fileId': fileId,
    'alt': 'media'
})
.then((response,rawData)=>{
    console.log('resp',response) //result: false, body: ''
    console.log('raw',rawData) //undefined
})

测试4

对文件/fileId 的 Google 请求,使用 .then

返回 200 OK,响应结果:false,正文:''

gapi.client.request({
    'path': 'https://www.googleapis.com/drive/v3/files/'+fileId,
    'method': 'GET',
    'params': {'fileId': fileId, 'alt': 'media'},
    'headers': {'Authorization': 'Bearer ' + oToken }
})
.then((response,rawData)=>{
    console.log('resp',response) //result: false, body: ''
    console.log('raw',rawData) //undefined
})

测试5

对文件/fileId 的 http 请求

返回 403 禁止,CORS 警告

var xhr = new XMLHttpRequest();
xhr.open('GET',
'https://www.googleapis.com/drive/v3/files/' + fileId +
'?alt=media&access_token=' + encodeURIComponent(oToken), true)
xhr.responseType = "blob"
xhr.onreadystatechange = ()=>{
    console.log('readyStateChange',xhr)
}
xhr.setRequestHeader('Authorization', 'Bearer ' + oToken)
xhr.send()

测试6

webContentLink 上的 http 请求,链接中带有访问令牌

返回 401 Unauthorized,CORS 警告

let reqUrl = wcLink + '&access_token=' + encodeURIComponent(oToken)
var xhr = new XMLHttpRequest()
xhr.open("GET", reqUrl, true)
xhr.responseType = "blob"
xhr.onreadystatechange = ()=>{
    console.log('readyStateChange',xhr)
}
xhr.setRequestHeader('Authorization', 'Bearer ' + oToken)
xhr.send()

测试7

webContentLink 上的 http 请求,链接中没有访问令牌,没有 responseType

我不明白这与上面的示例有何不同,在上面的示例中,我在 url 和 header 中都传递 access_token 并获得 401 unathorized 但在这里我只传递了 header 并获得 200 ok...

返回 200 OK,CORS 警告

let xhr = new XMLHttpRequest()
xhr.onreadystatechange = ()=>{
  console.log('response',xhr)
}
xhr.open('GET', wcLink, true)
xhr.setRequestHeader('Authorization', 'Bearer ' + oToken)
xhr.send()

全部回复:12,在网络标签中:3

【问题讨论】:

  • i.stack.imgur.com/5ejBC.png 处的图像显示一些响应是 401、403 和 404 错误。对于 4xx 错误,这是正常的,并且预期该错误不会有 Access-Control-Allow-Origin 响应标头。这是因为默认情况下,大多数服务器仅在 4xx 响应中发送最小的标头集。要在错误响应中包含其他标头,通常必须设置一些非默认选项。但即使那些 4xx 错误确实有 Access-Control-Allow-Origin 响应标头,它们仍然是需要修复的 4xx 错误。它们没有“被 CORS 阻止”——它们只是错误。
  • @sideshowbarker 好的,但他们仍然没有理由发生,我仍然在 url、标题和我得到了我登录的 cookie 中传递访问令牌......我为什么要被未经授权和禁止?
  • 你试过使用files: getTry this API吗?你仍然得到相同的结果吗?您是否将字段参数设置为获取默认 kindid,name,mimeType 以外的内容?
  • @RafaGuillermo 我正在使用 files.get 来获取这些测试中使用的 webContentLink,并且我正在使用带有 'alt': 'media' 的 files.get,就像在文档中为 downloading 描述的那样,在测试3。
  • @LukaKostic 你确定你的文本文件有正确的元数据并且有内容吗?您可以发布用于创建所述文件的代码吗?我从本地机器上传了一个 txt 文件到云端硬盘并运行 this function,这让我可以看到响应中的正文,其中包含预期的文件内容。

标签: javascript google-drive-api xmlhttprequest cors


【解决方案1】:

似乎我的上传代码无法正常工作,正在创建一个空文件。

我已手动向其中添加内容,现在可以在测试 2(原始)、3(响应)和 4(响应)的主体中正确检索到它

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2021-07-15
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    相关资源
    最近更新 更多