Google 驱动器 API 追加文件?

Google Drive API append file?

如何使用 API 将内容附加到 Google 驱动器中的文件末尾?

我真的必须下载整个东西,然后编辑本地副本,然后重新上传整个东西吗?

是的,您确实需要下载编辑文件并重新上传。无法以编程方式编辑文件。也许除了电子表格,但你会使用 Google 工作表 API 而不是 Google 驱动器 API.

您可以使用驱动器 api 的可恢复上传,但有一些限制:

  • (我不记得 ui 是不是真的)Minimum bytes uploaded 必须是 262144 除了“创建”文件,其中可以包含 less

  • one week后的upload-session expires, 如果您不知道最终文件大小,可以将 Content-Range 设置为 */*

  • file wont show up在google驱动在uiuntil complete,上传使用类似header的例子如下,其中 /* 是文件的最终字节长度。它必须少一个字节,如下例所示:262146/262147

我建议为 gcp 项目获取一个服务帐户,您可以在您的个人驱动器中创建一个文件夹并与服务帐户电子邮件共享。

为了节省一些时间,因为驱动api文档不是最好的,这里用“纯”python http requests:

首先您必须创建文件并获取 session_url:

    headers = {"Authorization": "Bearer "+myAccesstoken,
               "Content-Type": "application/json"}

    file_metadata = {
        'name': "myFile.txt",
        'mimeType': "text/plain",
        'parents': [myFolderid],
        "uploadType": "resumable"
    }
    r = requests.post(
        "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable",
        headers=headers,
        data=json.dumps(file_metadata)

    )
    session_url=r.headers['Location']

然后就可以上传数据了:

        headers = {
            "Authorization": "Bearer "+myAccesstoken,
            "Content-Range": 'bytes 0-262144/*'}

        if is_final_data:
            headers = {
                "Authorization": "Bearer "+myAccestoken,
                "Content-Range": 'bytes 262144-262146/262147'}

        sd = io.BytesIO()
        sd.write(bytes("Wurst", "ASCII"))
        sd.seek(0)
        r = requests.put(
            session_url,
            headers=headers,
            data=sd
        )

要获取最后上传的字节位置,如果您正在恢复上传,请仅使用 session url 和授权 header 发送一个空的放置请求并读取其响应 header秒之后。

您可以将 session url 存储在一个文件中并恢复上传一周。 注意:您将需要如下内容,因为访问令牌仅在有限的时间内有效。

if credentials.access_token_expired:
    credentials.refresh(httplib2.Http())