use*_*719 3 php google-drive-api
我想创建一个应用程序,可以将文件添加到谷歌驱动器并将该文件共享给其他用户(例如abc@gmail.com)。该用户 abc@gmail.com 应该登录到应用程序,然后他可以查看并下载其驱动器中的所有可用文件。目前我已经使用谷歌驱动器的服务帐户来实现此目的。我可以将文件上传到谷歌驱动器,并且可以将其共享给用户 abc@gmail.com。但我面临以下问题。
使用电子邮件 xyz@gmail.com 我注册了驱动器并创建了一个项目,但是当我创建文件并使用驱动器 API 将其共享给用户 abc@gmail.com 时,该文件未在 xyz@gmail.com 的驱动器上列出,但是当我尝试通过 API 访问该文件,我可以看到这些文件。
对于用户 abc@gmail.com,共享文件在他的驱动器中可用,我可以看到,当我通过网络访问他的驱动器时,但当我尝试通过 API 访问它时,它显示没有文件。
请建议我哪里出错了。我可以这样做吗?
for user **xyz@gmail.com
$CLIENT_ID='xxxxxxxxx.apps.googleusercontent.com';
$SERVICE_ACCOUNT_EMAIL = 'xxxxxxxxxxxx@developer.gserviceaccount.com';
$SERVICE_ACCOUNT_PKCS12_FILE_PATH = 'xxxxxxxxxx-privatekey.p12';**
For user **abc@gmail.com
$CLIENT_ID='yyyyyyyyyyy.apps.googleusercontent.com';
$SERVICE_ACCOUNT_EMAIL = 'yyyyyyyyyyyy@developer.gserviceaccount.com';
$SERVICE_ACCOUNT_PKCS12_FILE_PATH = 'yyyyyyyyyyyy-privatekey.p12';**
Run Code Online (Sandbox Code Playgroud)
使用用户 xyz@gmail ID 创建了一个项目,并使用他上面的 clientID、帐户电子邮件、密钥文件创建了文件:
function insertFile($service, $title, $description, $parentId, $mimeType, $filename) {
$file = new Google_DriveFile();
$file->setTitle($title);
$file->setDescription($description);
$file->setMimeType($mimeType);
// Set the parent folder.
if ($parentId != null) {
$parent = new ParentReference();
$parent->setId($parentId);
$file->setParents(array($parent));
}
try {
$data = file_get_contents($filename);
$createdFile = $service->files->insert($file, array(
'data' => $data,
'mimeType' => $mimeType,
'convert' =>TRUE,
)
);
$fileID = $createdFile->getId();
return $fileID;
} catch (Exception $e) {
print "An error occurred: " . $e->getMessage();
exit();
}
}
Run Code Online (Sandbox Code Playgroud)
使用以下代码将此文件共享给用户 abc@gmail.com:
function insertPermission($service, $fileId, $value='abc@gmail.com', $type = 'user', $role = 'writer') {
$newPermission = new Google_Permission();
$newPermission->setValue($value);
$newPermission->setType($type);
$newPermission->setRole($role);
try {
return $service->permissions->insert($fileId, $newPermission);
} catch (Exception $e) {
print "An error occurred: " . $e->getMessage();
}
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
然后检查 abc@gmail.com 的文件,我使用他的 clientID、accountEmail 和私钥文件登录,并检索我在下面的代码中使用的文件
function retrieveAllFiles($service) {
$result = array();
$pageToken = NULL;
do {
try {
$parameters = array();
if ($pageToken) {
$parameters['pageToken'] = $pageToken;
}
$files = $service->files->listFiles($parameters);
$result = array_merge($result, $files->getItems());
$pageToken = $files->getNextPageToken();
} catch (Exception $e) {
print "An error occurred: " . $e->getMessage();
$pageToken = NULL;
}
} while ($pageToken);
return $result;
}
Run Code Online (Sandbox Code Playgroud)
我认为我使用不同的 clientID、accountEmail 和私钥,因此文件不会列出到 abc@gmail.com,但如果我使用 xyz@gmail.com 的相同 clientID、帐户电子邮件和私钥,那么我会获取所有文件。我想要的只是一些文件将共享到 abc@gmail.com 并且他应该只获得这些文件。
这是因为 xyz@gmail.com 不拥有该文件,也没有对该文件的任何访问权限。服务帐户创建了该文件,因此是所有者。您与 abc@gmail.com 共享了该文件,以便他们可以看到该文件,但您从未授予 xyz@gmail.com 对该文件的访问权限。(xyz@gmail.com 创建服务帐户的事实在这里并不重要,该文件明确由服务帐户拥有,而不是 xyz@gmail.com)。
如果 abc@gmail.com 有权访问 UI 中的文件,则他们在通过 API 进行身份验证时应该有权访问。你能在这里展示你的代码吗?