【问题标题】:HttpError 400 when requesting https://www.googleapis.com/upload/drive/v2/files/... returned "Invalid Upload Request"请求 https://www.googleapis.com/upload/drive/v2/files/ 时出现 HttpError 400...返回“无效的上传请求”
【发布时间】:2013-07-28 14:18:00
【问题描述】:

不确定这里的 API 下发生了什么,但从我的调试输出来看,一切看起来都还不错。它将一个 ID 传递给一个有效的文件等等。有没有办法在 Google SDK 中启用调试输出?

我在 HTTP 错误之前看到了几个警告:

WARNING:oauth2client.util:new_request() takes at most 1 positional argument (2 given)
WARNING:oauth2client.util:new_request() takes at most 1 positional argument (2 given)

代码如下:

def update(self, path, properties, media_body = None):
    info = self.stat(path)

    if not info:
        debug("No such file: %s" % path)
        return None

    # Merge properties
    for k, v in properties.iteritems():
        # Do not update the ID, always use the path obtained ID.
        if k == 'id': continue

        setattr(info, k, v)

    try:
        debug("Updating: %s" % info)
        return self.service().files().update(
            fileId = info.id,
            body = info.dict(),
            media_body = media_body
        ).execute()
    except Exception, e:
        debug("Update failed: %s" % str(e))
        debug.stack()
        return None

好的,这个函数是通过文件类(本地或远程)调用的。在这种情况下,是远程文件类调用该函数,提供对本地文件类上传器(media_upload)的引用:

所以在远程文件类中,我实现了这个方法。 Drive() 类是我自己的 Google API 包装器:

def _updateFile(self, path, src):
    debug("Updating remote file: %s" % path)

    if GsyncOptions.dry_run: return

    drive = Drive()
    info = drive.update(path, src.getInfo(), src.getUploader())

    if info is None:
        debug("Update failed")

“src”变量是对另一个文件类(本地文件)的引用。它调用 getUploader 将引用传递给上传器。这实现如下:

def getUploader(self, path = None):
    info = self.getInfo(path)
    if info is None:
        raise Exception("Could not obtain file information: %s" % path)

    path = self.getPath(path)

    f = open(path, "r")
    if f is None:
        raise Exception("Open failed: %s" % path)

    from apiclient.http import MediaIOBaseUpload

    return MediaIoBaseUpload(f, info.mimeType, resumable=True)

【问题讨论】:

  • 请分享您构建的代码media_body。另外,不传递media_body参数,只更新元数据时,是否也会出现同样的错误?
  • 我会尝试不使用 media_body。如果您给我一点时间,我将发布 media_body 代码...
  • 我删除了 media_body 并且您可能已经猜到了,更新似乎有效。但是,目的是更新文件内容。
  • 哦,警告也消失了。

标签: python google-drive-api


【解决方案1】:

回答“有没有办法在 Google SDK 中启用调试输出?”部分问题,请查看https://developers.google.com/api-client-library/python/guide/logging

【讨论】:

  • 谢谢。我会启用它,看看我能不能看到发生了什么。
  • 请注意 link-only answers 是不鼓励的,所以答案应该是寻找解决方案的终点(与另一个中途停留的参考相比,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
  • 虽然我同意这个原则,但在这种情况下,我发布的链接是谷歌自己关于如何在 python SDK 中启用调试的权威参考。通过传递链接,未来的读者将被引导到最新的、明确的参考,而不是复制.粘贴页面的某些部分,这可能会随着 Google 更新其库而迅速过时。
【解决方案2】:

问题似乎是用于创建文档的insert() API 方法需要为文档正文(或 media_body)定义一个值。我最初创建的文档是空的,根本没有提供文档正文,基本上将其保留为None。这造成了我在驱动器上有一个无法更新的文档的情况。通过创建具有空正文的文档,更新开始工作:

return self.service().files().insert(
    body = info.dict(),
    # An empty media_body.
    media_body = ""
).execute()

【讨论】:

    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 2013-04-25
    • 2012-07-21
    • 2017-03-23
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多