首页 > 解决方案 > Google Drive API 无法处理大型 App Script 项目上传

问题描述

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

我尝试使用 上传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

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

标签: curlgoogle-apps-scriptgoogle-drive-apigoogle-apps-script-api

解决方案


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

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


推荐阅读