我们如何使用 google 驱动器 api 和 PHP 更新文件的权限?
How we can update the permissions of a file using google drive api with PHP?
我想使用 google 驱动器 api 和 PHP 更新我的用户权限。
我是这样做的-
$Service = new Google_Service_Drive($Client);
$OptParams = array(
'fields' => '*'
);
$Reponse = $Service->files->get($FileId,$OptParams);
foreach ($Reponse->getPermissions() as $PermissionValue) {
$PermissionId = $PermissionValue->getId();
$PermissionValue->setRole('reader');
$result = $Service->permissions->update($FileId,$PermissionId,$PermissionValue);
}
return $result;
从上面的代码中我可以获得我的文件 ID 和权限 ID,但是它在更新方法时抛出了错误。我在更新文件的用户权限时在做什么。
我收到这个错误-
Fatal error: Uncaught Google\Service\Exception: { "error": { "errors": [ { "domain": "global", "reason": "fieldNotWritable", "message": "The resource body includes fields which are not directly writable." } ], "code": 403, "message": "The resource body includes fields which are not directly writable." } }
谁能告诉我我做错了什么或者我错过了什么?更新用户权限的正确方法是什么?
permissions get method returns a Permissions response 对象。此对象包含许多不可写的字段。
permissions update 方法使用 HTTP 补丁方法。这意味着它将尝试更新您发送的每个 属性,即使是那些不可写的。
因此,通过从获取权限方法加载 $PermissionValue 对象,您将填充到许多 属性es。
您应该创建一个新的权限对象,并且只设置您需要更新的内容。在这种情况下是角色。
$newPermission = new Google_Service_Drive_Permission();
$newPermission ->setRole('reader');
$result = $Service->permissions->update($FileId,$PermissionId,$newPermission );
问题:
您正在提供 Permissions returned by Files: get 中的所有属性。其中一些属性,例如 id
本身,是不可写的。
解决方案:
Permissions: update 使用补丁语义来更新权限,这意味着只有您直接提供的字段才会被更新;不需要提供像 id
这样的字段,因为不提供它们不会导致这些字段从更新的权限中删除。
因此,您应该只提供要更新的字段。在本例中,即 role
。创建一个新的权限对象(参见Google_Service_Drive_Permission)并设置其角色:
foreach ($Response->getPermissions() as $PermissionValue) {
$PermissionId = $PermissionValue->getId();
$updatedPerm = new Google_Service_Drive_Permission();
$updatedPerm->setRole("reader");
$result = $Service->permissions->update($FileId,$PermissionId,$updatedPerm);
}
注:
对于与文件所有者相关的权限,这将失败,因为您不能在不转移所有权的情况下删除文件的所有者(参见方法文档中的参数 transferOwnership
)。
我想使用 google 驱动器 api 和 PHP 更新我的用户权限。 我是这样做的-
$Service = new Google_Service_Drive($Client);
$OptParams = array(
'fields' => '*'
);
$Reponse = $Service->files->get($FileId,$OptParams);
foreach ($Reponse->getPermissions() as $PermissionValue) {
$PermissionId = $PermissionValue->getId();
$PermissionValue->setRole('reader');
$result = $Service->permissions->update($FileId,$PermissionId,$PermissionValue);
}
return $result;
从上面的代码中我可以获得我的文件 ID 和权限 ID,但是它在更新方法时抛出了错误。我在更新文件的用户权限时在做什么。
我收到这个错误-
Fatal error: Uncaught Google\Service\Exception: { "error": { "errors": [ { "domain": "global", "reason": "fieldNotWritable", "message": "The resource body includes fields which are not directly writable." } ], "code": 403, "message": "The resource body includes fields which are not directly writable." } }
谁能告诉我我做错了什么或者我错过了什么?更新用户权限的正确方法是什么?
permissions get method returns a Permissions response 对象。此对象包含许多不可写的字段。
permissions update 方法使用 HTTP 补丁方法。这意味着它将尝试更新您发送的每个 属性,即使是那些不可写的。
因此,通过从获取权限方法加载 $PermissionValue 对象,您将填充到许多 属性es。
您应该创建一个新的权限对象,并且只设置您需要更新的内容。在这种情况下是角色。
$newPermission = new Google_Service_Drive_Permission();
$newPermission ->setRole('reader');
$result = $Service->permissions->update($FileId,$PermissionId,$newPermission );
问题:
您正在提供 Permissions returned by Files: get 中的所有属性。其中一些属性,例如 id
本身,是不可写的。
解决方案:
Permissions: update 使用补丁语义来更新权限,这意味着只有您直接提供的字段才会被更新;不需要提供像 id
这样的字段,因为不提供它们不会导致这些字段从更新的权限中删除。
因此,您应该只提供要更新的字段。在本例中,即 role
。创建一个新的权限对象(参见Google_Service_Drive_Permission)并设置其角色:
foreach ($Response->getPermissions() as $PermissionValue) {
$PermissionId = $PermissionValue->getId();
$updatedPerm = new Google_Service_Drive_Permission();
$updatedPerm->setRole("reader");
$result = $Service->permissions->update($FileId,$PermissionId,$updatedPerm);
}
注:
对于与文件所有者相关的权限,这将失败,因为您不能在不转移所有权的情况下删除文件的所有者(参见方法文档中的参数 transferOwnership
)。