请求https://www.googleapis.com/upload/drive/v2/files / ...时出现HttpError 400“无效的上传请求”

时间:2013-07-28 21:27:44

标签: python google-drive-api

不确定这里的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)

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

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