curl - 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
超时后,所有后续尝试都返回相同的范围。
解决方案
显然问题是我上传的文件本身。我意识到我正在根据我在几个测试之一中删除的 ID 上传项目内的一个文件(即项目 JSON 文件内)。这个过程很容易出错,我没有看到。
在修复该问题并停止原始块之后,我可以检查待处理的字节并成功发送完成上传的第二块。
推荐阅读
- python - 删除模型后,如何在 Python 中释放 TF/Keras 内存,而其他模型仍在内存中并正在使用中?
- delphi - 应用程序不以 4K 显示器为中心
- android - 屏幕旋转后列表从头开始加载
- javascript - textarea onChange 不更新状态
- html - Apple App Store 徽章重定向到移动设备而非桌面设备上的可疑广告
- java - 如何从 JTextField 获取字符串并将其保存在变量中的更新?
- python - 我们可以为 pd.to_numeric 设置特定的列和行吗?
- android - Firestore addSnapshotListener 不起作用
- java - Java中不同类型的连接
- javascript - 对象作为 React 子对象无效(找到:带有键 {arr} 的对象)。如果您打算渲染一组孩子,请改用数组