使用Curl将Zip文件上传到Google Drive

12

我正在尝试使用 curl 将一个zip文件上传到Google Drive账户。

文件已成功上传,但文件名没有更新。它使用默认文件名"Untitled"上传。

我正在使用以下命令:

curl -k -H "Authorization: Bearer cat /tmp/token.txt" -F "metadata={name : 'backup.zip'} --data-binary "@backup.zip" https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart

你需要仅使用curl来完成吗?如果不需要,你可以使用'gdrive'命令(http://olivermarshall.net/how-to-upload-a-file-to-google-drive-from-the-command-line/) - Igor Uchôa
我正在路由器上运行此程序,但该路由器没有安装gdrive的空间。因此,我编写了自定义脚本来完成此操作。 - Saran Brar
看一下这个论坛的评论:https://gist.github.com/deanet/3427090#gistcomment-1253229。也许你需要根据这篇文章设置一些变量。 - Igor Uchôa
1
谢谢您的回复,但我已经尝试过了,看起来Google Drive已经改变了它处理命令行上传的方式。您提到的帖子非常古老,已经创建了5年。 - Saran Brar
2个回答

28
您可以使用Drive API v3来上传zip文件。修改后的curl代码如下所示。
curl -X POST -L \
    -H "Authorization: Bearer `cat /tmp/token.txt`" \
    -F "metadata={name : 'backup.zip'};type=application/json;charset=UTF-8" \
    -F "file=@backup.zip;type=application/zip" \
    "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart"

为了使用此功能,请在范围内包含https://www.googleapis.com/auth/drive


非常感谢Tanaike!!!你太棒了...顺便说一下,V2也可以使用相同的代码。 - Saran Brar
@nbuser 欢迎。谢谢你也。 - Tanaike
请问您能否评论一下如何使用相同的代码将文件上传到特定文件夹中。谢谢。 - Saran Brar
@nbuser 请在“metadata”中包含“parents: ['###文件夹ID###']”。 - Tanaike
@Tanaike 我得到了一个401错误。Bearer是我们在Google开发者控制台中创建的API密钥吗? - Ashwin
显示剩余3条评论

16
上面的答案很好用,我也是用Curl上传文件到Google Drive时使用的命令。然而,我不明白scope是什么以及使该命令工作所需的所有初始设置。因此,为了记录目的,我将给出第二个答案。
截至撰写本文时有效...
访问凭据页面并创建新凭据(假设您已创建项目)。我为电视和有限输入设备创建了凭据,因此工作流程类似于:
创建凭据> OAuth客户端ID> 应用程序类型> 电视和有限输入设备> 命名客户端> 点击创建。
完成后,在查看新创建的凭据时,我能够复制客户端ID和客户端密钥。
注:只有Curl命令中带有双星号的变量应被替换。
下一步是运行Curl命令:
curl -d "client_id=**client_id**&scope=**scope**" https://oauth2.googleapis.com/device/code

在这种情况下,“范围”可以被认为是您希望使用输入的“client_id”凭据所拥有的访问权限类型。有关文档的更多信息。对于重点上传文件的用例,选择的范围是https://www.googleapis.com/auth/drive.file
运行上述curl命令后,您将获得类似以下响应:
{ "device_code": "XXXXXXXXXXXXX", "user_code": "ABCD-EFGH", "expires_in": 1800, "interval": 5, "verification_url": "https://www.google.com/device" }
接下来的步骤是在浏览器中访问响应中的verification_url,提供user_code并接受权限请求。当所有提示都已遵循时,您将被呈现一个代码,这个代码不需要进行剩余步骤(但可能有一些原因要在其他用例中使用它)。
接下来的步骤是使用Curl命令:
curl -d client_id=**client_id** -d client_secret=**client_secret** -d device_code=**device_code** -d grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Adevice_code https://accounts.google.com/o/oauth2/token

您将获得类似以下响应:

{ "access_token": "XXXXXXXXX", "expires_in": 3599,
"refresh_token": "XXXXXXXXX", "scope": "https://www.googleapis.com/auth/drive.file", "token_type": "Bearer" }

现在,您可以使用访问令牌并遵循接受的答案,使用类似于Curl命令的方式:

curl -X POST -L \
    -H "Authorization: Bearer **access_token**" \
    -F "metadata={name : 'backup.zip'};type=application/json;charset=UTF-8" \
    -F "file=@backup.zip;type=application/zip" \
    "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart"

1
非常感谢您提供详细的、逐步的答案。对于像我这样的愚蠢聪明人来说,这是一个救命稻草! - liltitus27
电视和有限设备的clientid/secret仅适用于该类型的客户端。使用Curl访问https://oauth2.googleapis.com/device/code会返回错误:invalid_client。只有类型为“电视和有限输入设备”的客户端才能使用用于电视和有限输入设备应用程序的OAuth 2.0流程。请创建并使用适当的客户端。 - JRichardsz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接