当前位置: 首页 > 知识库问答 >
问题:

HttpError 400请求时https://www.googleapis.com/upload/drive/v2/files/...返回"无效上传请求"

孔宇
2023-03-14

不确定这里的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\u 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个答案

纪俊良
2023-03-14

问题似乎是,用于创建文档的API方法需要为文档正文(或media\u body)定义一个值。我最初创建的文档是空的,没有提供任何文档正文,基本上保留为无。这就产生了这样一个场景:我的驱动器上有一个无法更新的文档。通过创建具有空正文的文档,更新随后开始工作:

return self.service().files().insert(
    body = info.dict(),
    # An empty media_body.
    media_body = ""
).execute()
党祖鹤
2023-03-14

回答“是否有任何方法可以在Google SDK中启用调试输出?”问题的一部分,请检查https://developers.google.com/api-client-library/python/guide/logging.

 类似资料:
  • 更新:这是GoogleDrive中的一个错误,CORS未启用上传URI。@Nivco向我指出了使用iframe和代理(而不是CORS)的Google客户端库的工作。我将(测试过的)工作代码放在底部,并附有详细说明。请参阅下面的示例答案。 通过API将文件插入到谷歌云端硬盘并使用JavaScript授权谷歌云端硬盘表示上传终端节点支持CORS,但我无法使用它们。我可以使用 Files: insert

  • 我正试图使用Google API将视频上传到youtube上,并收到以下错误通知:未定义变量:在/home/critter/public_html/test-video.php第136行中的htmlBody 出现服务错误:调用PUT https://www.googleapis.com/Upload/youtube/v3/videos?part=status%2csnippet&uploadtyp

  • 我已经使用zappa在aws lambda上部署了一个flask应用程序,现在该应用程序在所有endpoint上都运行良好,除了我的主endpoint,当我对其发出post请求时,它返回{“消息”:“endpoint请求超时”} 真的需要一个修复或想法如何克服这个我需要调用分析路线,部署的url是 https://2ixfyfcsik.execute-api.eu-west-2.amazonaws

  • 再一次在布罗斯沃尔,一切都很完美。在PhoneGap应用程序上仅GET request有效

  • 我正在尝试从JavaScript应用程序向另一个应用程序中的endpoint进行API调用。 当我调用endpoint时,我得到了状态代码和消息,但我无法以任何方式访问响应体。我已经尝试了不同的方法来获取数据,但似乎没有一种方法对我有效。 在方法“someAction”中,我想使用来自API调用的响应/结果中的数据。我在代码中添加了单个日志行打印的输出。 如何在定义“result.status/m

  • 问题内容: 我正在尝试通过COM端口发送AT命令,但只重新发送了相同的命令。 日志: 16:19:21.910 [main]调试SerialConnections.M234Serial-创建实例。 16:19:21.974 [main]调试SerialConnections.M234Serial-发送请求:AT ^ SCFG? 16:19:23.976 [EventThread COM55]调试S