Создать файл / папку на общем диске через служебную учетную запись - PullRequest
0 голосов
/ 13 января 2020

Я использую G-Suite Google Drive и служебную учетную запись для подключения к общему диску. Я использую библиотеку API PHP. Ранее я выполнял эту работу на «обычном» диске Google, но мы переходим на общий диск (он же Team Drive)

Я могу использовать 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);

Это работает и дает мне идентификатор для указанного c файла / папки, которую я запрашиваю.

Однако попытка создать папку в верхней папке на диске приводит к ошибке 404, говоря, что файл / папка не найден, хотя я только что получил из нее правильный идентификатор.

        $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. Я много раз проверял, что идентификатор файла для родителя правильный. Я пробовал использовать 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."
  }
}

Этот процесс работает с «обычным» диском, но не работает на общем диске.

У кого-нибудь есть идеи, чего не хватает?

1 Ответ

1 голос
/ 14 января 2020

Вы предоставляете supportsAllDrives в теле запроса, когда вы должны предоставить его в качестве параметра запроса, как указано здесь . Кроме того, supportsTeamDrives и teamDriveId не нужны (и они устарели). Поэтому вы должны изменить это:

$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 в теле запроса, а не в качестве параметра, вы не можете получить доступ к общим дискам.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...