我有一个与GoogleDriveAPI v3集成的PHP Web应用程序,它可以在Google云端硬盘上创建文件夹,为用户列表设置不同的权限,向每个用户显示文件夹内容,并且用户应该能够访问文件(拥有与文件夹相同的权限)直接在Google文档中在我的应用程序外部的新窗口中打开它们。这些用户可能没有Google帐户。
在我的数据库中,我存储了Google Drive API获得的文件夹ID和设置权限后获得的权限ID。
当用户查看文件夹内容时,我的应用程序调用相关的API来获取文件夹内的文件列表(在此处https://developers.google.com/drive/api/v3/reference/files/list进行解释),然后我管理webViewLink json密钥,该密钥是文档的链接,但是我不知道如何允许直接在Google文档中打开文件的方式,而不给那些没有Google帐户的用户传递权限。
我试图直接在Google云端硬盘文件夹中创建和共享应用程序之外的文档,但是我收到了一封包含以下链接的电子邮件: https://docs.google.com/document/d/xxxxxx-file-id/edit?usp=sharing_eip&ts=5d03b1c1注意:由于保留的内容,我无法发布正确的链接。 通过打开链接,即使我没有以Google帐户身份登录(我的昵称显示为动物),我也可以修改文档,因此Google知道打开链接可以编辑文件。
//create Folder
public function createRootFolder($name, $folder_root)
{
$fileMetadata = new Google_Service_Drive_DriveFile(array(
'name' => $name,
"parents" => [$folder_root],
'mimeType' => 'application/vnd.google-apps.folder'));
$file = $this->service->files->create($fileMetadata, array(
'fields' => 'id'));
return $file;
}
//setPermission
public function setPermission($folderId, $typePermission = 'user' ,
$rolePermission , $emailAddress)
{
$return = false;
$this->service->getClient()->setUseBatch(true);
try {
$batch = $this->service->createBatch();
$userPermission = new Google_Service_Drive_Permission(array(
'type' => $typePermission,
'role' => $rolePermission,
'emailAddress' => $emailAddress,
'setDisplayName' => $emailAddress
));
$request = $this->service->permissions->create(
$folderId, $userPermission, array('fields' => 'id')
);
$batch->add($request, 'user');
$results = $batch->execute();
foreach ($results as $result) {
if ($result instanceof Google_Service_Exception) {
$return = null;
} else {
$return = $result->id ;
}
}
} finally {
$this->service->getClient()->setUseBatch(false);
}
return $return;
}
//getFileList
public function getFileList($folderId=null)
{
$l = [];
$optParams = array(
'fields' => '*',
'q' => '\''.$folderId.'\' in parents'
);
$response = $this->service->files->listFiles($optParams);
$ll = [];
foreach ($response->files as $file) {
array_push($l,
array(
'id'=>$file->id,'name'=>$file->name,
'modifiedTime'=>$file->modifiedTime,
'createdTime'=> $file->createdTime,
'webViewLink' => $file->webViewLink
));
array_push($ll ,array('file', $file));
}
return $l;
}
在这里,我想打开Google文档文件
<a href="https://docs.google.com/document/d/xxxxxx-file-id/edit">Apri</a>
我希望,当我通过电子邮件收到链接时可以打开和修改文件,因此我可以生成相同的链接供用户通过我的应用程序打开它。
答案 0 :(得分:0)
您所说的是每个人都可以访问的链接,正如您所说的,这种方式与与特定的Google帐户共享Google文档之间的主要区别在于,如果您使用 anyoneWithTheLink ,即使您使用Google帐户登录,您也将是匿名的,这意味着您所做的编辑将以匿名的形式出现[1]。
如果要获取此可编辑链接,则必须使用以下$userPermission
变量,而不要使用[2]:
$userPermission = new Google_Service_Drive_Permission(array(
'type' => ’anyone’,
'role' => ‘writer’,
‘allowFileDiscovery’ => false //If true, the link will be discoverable in internet
));
您可以对每个文件使用一次setPermission方法,因此它们都具有可共享链接,任何具有链接的人都可以编辑该链接。
[1] https://support.google.com/drive/answer/2494822?hl=en&co=GENIE.Platform=Desktop
[2] https://developers.google.com/drive/api/v3/reference/permissions/create