【问题标题】:Create file/folder on Shared drive via service account通过服务帐户在共享驱动器上创建文件/文件夹
【发布时间】:2020-01-13 17:39:45
【问题描述】:

我正在使用 G-Suite Google 云端硬盘和服务帐户连接到共享云端硬盘。我正在使用 PHP API 库。我之前使用“常规”谷歌驱动器进行了这项工作,但我们正在转向共享驱动器(又名团队驱动器)

我可以使用 files->listFiles() 来获取文件列表,使用:

    $options = array('pageSize'          => 100,
                 'corpora'               => 'drive',
                 'supportsTeamDrives'    => true,
                 'includeTeamDriveItems' => true,
                 'teamDriveId'           => $sharedID,
                 'fields'                => "nextPageToken, files(id, name)",
                 'q'                     => "'" . $pParentFolderID . "' in parents "
               . " and name = \"" . $pFolderName . "\" "
               . " and mimeType = 'application/vnd.google-apps.folder' "
               . " and not trashed"
);
try{
    $files_list = $this->drive_service->files->listFiles($optParams);

这有效,并为我提供了我要求的特定文件/文件夹的 ID。

但是,尝试在驱动器的顶部文件夹中创建一个文件夹会导致 404 错误,说找不到文件/文件夹,即使我刚刚从中检索到正确的 ID。

        $param =array(  'supportsAllDrives' => true,
                'supportsTeamDrives'    => true,
                'teamDriveId'           => $SharedID,
                'parents'               => array($pParentFolderID),
                'name'                  => $pFolderName,
                'mimeType'              => 'application/vnd.google-apps.folder');

    $fileMetadata = new Google_Service_Drive_DriveFile($param);

try {
    $folderObj = $this->drive_service->files->create($fileMetadata, array('fields' => 'id'));

我已经尝试了各种排列,但总是得到 404。我已经多次验证父级的文件 ID 是正确的。我尝试过使用 teamdriveid、driveid 和其他各种选项。

这是我发送的数据和我从 Google 返回的数据:

array(6) {
  ["supportsAllDrives"]=>
  bool(true)
  ["supportsTeamDrives"]=>
  bool(true)
  ["teamDriveId"]=>
  string(19) "0ALay-iFeEOX6Uk9PVA"
  ["parents"]=>
  array(1) {
    [0]=>
    string(33) "1oI72fkTb-AObYWBEOI-ykS5eDYg3L2ar"
  }
  ["name"]=>
  string(9) "FieldTest"
  ["mimeType"]=>
  string(34) "application/vnd.google-apps.folder"
}

Trying to create:
Error from Google:array(1) {
  ["error"]=>
  array(3) {
    ["errors"]=>
    array(1) {
      [0]=>
      array(5) {
        ["domain"]=>
        string(6) "global"
        ["reason"]=>
        string(8) "notFound"
        ["message"]=>
        string(50) "File not found: 1oI72fkTb-AObYWBEOI-ykS5eDYg3L2ar."
        ["locationType"]=>
        string(9) "parameter"
        ["location"]=>
        string(6) "fileId"
      }
    }
    ["code"]=>
    int(404)
    ["message"]=>
    string(50) "File not found: 1oI72fkTb-AObYWBEOI-ykS5eDYg3L2ar."
  }
}

此过程适用于“常规”驱动器,但在共享驱动器上失败。

有人知道缺少什么吗?

【问题讨论】:

    标签: google-drive-api


    【解决方案1】:

    您在请求正文中提供supportsAllDrives,而您应该将其作为查询参数提供,如指定的here。此外,不需要supportsTeamDrivesteamDriveId(它们已被弃用)。所以你应该改变这个:

    $param =array(  'supportsAllDrives' => true,
                    'supportsTeamDrives'    => true,
                    'teamDriveId'           => $SharedID,
                    'parents'               => array($pParentFolderID),
                    'name'                  => $pFolderName,
                    'mimeType'              => 'application/vnd.google-apps.folder');
    

    到这里:

    $param =array(  'parents'               => array($pParentFolderID),
                    'name'                  => $pFolderName,
                    'mimeType'              => 'application/vnd.google-apps.folder');
    

    另外,正如我所说,您应该在拨打电话时提供supportsAllDrives 作为参数。所以你应该改变这个:

    $folderObj = $this->drive_service->files->create($fileMetadata, array('fields' => 'id'));
    

    到这里:

    $folderObj = $this->drive_service->files->create($fileMetadata, array('fields' => 'id', 'supportsAllDrives' => true));
    

    由于您在请求正文中提供 supportsAllDrives 而不是作为参数,因此您无法访问共享云端硬盘。

    希望对你有帮助。

    【讨论】:

    • 这不起作用。我在 Resource.php 中得到“(创建)未知参数:'supportsAllDrives'”异常在通过文件跟踪到 Drive.php 之后,它只列出了“fileId”作为创建方法的可选参数:'create' => array( 'path' => 'files/{fileId}/comments', 'httpMethod' => 'POST', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), 所以,我'不确定解决方案是什么。
    • @ArnorBaldvinsson 显然你是not using an up-to-date library。检查我提供的链接并在此处指定说明,以便使用支持supportsAllDrives 的更新库。此外,您在上一条评论中查看的方法资源不是您想要的。您不想创建评论而是创建文件。这就是为什么只有fileId 被列为参数。请让我知道这些迹象是否足以解决您的问题,否则我会更详细地研究它。
    • 谢谢!我以为我使用的是最新的 - 昨天从 Github 上的那个 repo 下载的,但也许我的项目中的所有内容都没有更新!将确保我拥有所有最新信息,并让您知道结果如何!
    • 非常感谢您的帮助!!!我更新了所有的谷歌库,它成功了!
    • 这很有帮助。我要疯了,以为我要解决 SCOPE 问题或权限问题。我正在使用 Python 库。以下终于奏效了。如果 data_forms_folder_id 不是 None: data = {'name': 'My new Sheet 2', 'mimeType': 'application/vnd.google-apps.spreadsheet' ,'parents': [data_forms_folder_id] } sheet = DRIVE.files( ).create(body=data,supportsAllDrives=True,supportsTeamDrives=True).execute()
    猜你喜欢
    • 2020-09-15
    • 2021-03-31
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多