【问题标题】:Google Drive API cannot handle large App Script project uploadGoogle Drive API 无法处理大型 App Script 项目上传
【发布时间】:2020-04-23 15:53:42
【问题描述】:

我找不到任何关于 App Script 项目文件大小限制的文档,但这似乎是我的问题。我有一个必须添加到 App Script 项目的大型 JS 文件 - 项目的结果 JSON 有 5.4 MB。我尝试使用网络编辑器添加新的 JS 文件,但由于它太大,浏览器无法处理它。然后我想使用 Google API 导出 App Script 文件,添加新内容,然后使用另一个 API 再次将结果导入 Drive,如下所述:https://developers.google.com/apps-script/guides/import-export

我尝试使用 uploadType=media 上传,但失败并出现 408(请求超时)错误。我认为这是因为文件大于 5MB,因为文档建议使用uploadType=resumable。然后我按照两种方法尝试了后一种类型:单个请求 - 由于文件大小而再次失败,正如预期的那样,以及作为多个请求,理论上应该可以工作。但我可能会在上传初始 5MB 后尝试超时,几分钟后返回 408。

似乎 API 能够上传最初的 5MB,但之后就丢失了。我读到的关于 Drive 的所有内容都让我相信这不是 Drive 限制,所以我怀疑这是 App Script 限制。

步骤如下:

创建可恢复的上传会话

curl -X PUT \
-H "Authorization: $GOOGLE_BEARER_TOKEN" \
-H "X-Upload-Content-Type: application/vnd.google-apps.script+json" \
-H "X-Upload-Content-Length: 5415490" \
-H "Content-Type: application/json; charset=UTF-8" \
-H "Content-Length: 23" \
-d "{\"title\": \"MyProject\"}" \
-v "https://www.googleapis.com/upload/drive/v2/files/###FILE_ID###?uploadType=resumable"

接收上传 ID 和 URL

HTTP/2 200 
x-guploader-uploadid: ###UPLOAD_ID###
location: https://www.googleapis.com/upload/drive/v2/files/###FILE_ID###?uploadType=resumable&upload_id=###UPLOAD_ID###

存储网址

GOOGLE_UPLOAD_LOCATION=https://www.googleapis.com/upload/drive/v2/files/###FILE_ID###?uploadType=resumable&upload_id=###UPLOAD_ID###

发送第一个块

curl -X PUT \
-H "Authorization: $GOOGLE_BEARER_TOKEN" \
-H "Content-Type: application/vnd.google-apps.script+json" \
-H "Content-Length: 5242879" \
-H "Content-Range: bytes 0-5242878/5415490" \
-T file_chunk_1 \
-v "$GOOGLE_UPLOAD_LOCATION"

成功:收到前 4980736 个字节

HTTP/2 308 
range: bytes=0-4980735

发送第一个块,连同剩余的字节

curl -X PUT \
-H "Authorization: $GOOGLE_BEARER_TOKEN" \
-H "Content-Type: application/vnd.google-apps.script+json" \
-H "Content-Length: 434754" \
-H "Content-Range: bytes 4980736-5415489/5415490" \
-T file_chunk_2 \
-v "$GOOGLE_UPLOAD_LOCATION"

几分钟后超时

HTTP/2 408 

检查上传状态:

curl -X PUT \                          
-H "Authorization: $GOOGLE_BEARER_TOKEN" \
-H "Content-Length: 0" \
-H "Content-Range: bytes */5415490" \
-v "$GOOGLE_UPLOAD_LOCATION"

我看到只上传了前 5MB:

HTTP/2 308
range: bytes=0-5242879

在超时之后,所有后续尝试都返回相同的范围。

【问题讨论】:

  • 你应该在 issuetracker 中创建一个问题。有关详细信息,请参阅tag info page。想知道你在一个 5mb 的 js 文件中有什么吗?
  • 不是最好的设计,但它是脚本使用的数据列表。我已经在考虑把它放在别的地方了。

标签: curl google-apps-script google-drive-api google-apps-script-api


【解决方案1】:

显然问题是我上传的文件本身。我意识到我正在根据我在几个测试之一中删除的 ID 在项目中(即项目 JSON 文件中)上传一个文件。这个过程很容易出错,我没有看到。

修复该问题并暂停原始块后,我可以检查待处理字节并成功发送完成上传的第二个块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2016-09-30
    相关资源
    最近更新 更多