如何从 Google Drive REST api v3 获取共享 link?
How can I get share link from Google Drive REST api v3?
将文件上传到 GoogleDrive 后,我可以从响应中得到一个 fileId
,然后我将 fileId
传递给以下函数:
public function createShareLink($fileId, $accessToken){
$ch = curl_init();
$options = [
CURLOPT_URL => 'https://www.googleapis.com/drive/v3/files/'.$fileId.'/permissions',
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => json_encode(['type'=>'anyone', 'role'=>'reader',]),
CURLOPT_HTTPHEADER => [
'Authorization:Bearer '.$accessToken,
'Content-Type:application/json',
],
//In case you're in Windows, sometimes will throw error if not set SSL verification to false
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
];
//In case you need a proxy
//$options[CURLOPT_PROXY] = 'http://127.0.0.1:1087';
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
return $result;
}
确实有效,而且 returns json:
{
"kind": "drive#permission",
"id": "anyoneWithLink",
"type": "anyone",
"role": "reader",
"allowFileDiscovery": false
}
GoogleDrive中的文件确实变成了共享状态:
但是在响应json中没有share link,所以我查看了文档,在here中,你可以找到fields
参数(见截图以下):
单击 partial response 会将您重定向到一个页面,其中包含一些有关如何将值传递给 fileds
参数的示例。
我按照示例将 webViewLink
作为值传递给 fields
,如下所示:
CURLOPT_URL => 'https://www.googleapis.com/drive/v3/files/'.$fileId.'/permissions?fields=webViewLink',
但是响应错误:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "invalidParameter",
"message": "Invalid field selection webViewLink",
"locationType": "parameter",
"location": "fields"
}
],
"code": 400,
"message": "Invalid field selection webViewLink"
}
}
我试过了id
:
CURLOPT_URL => 'https://www.googleapis.com/drive/v3/files/'.$fileId.'/permissions?fields=id',
响应是:
{
"id": "anyoneWithLink"
}
我试过了 name
:
CURLOPT_URL => 'https://www.googleapis.com/drive/v3/files/'.$fileId.'/permissions?fields=name',
响应是:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "invalidParameter",
"message": "Invalid field selection name",
"locationType": "parameter",
"location": "fields"
}
],
"code": 400,
"message": "Invalid field selection name"
}
}
我试过了 mimeType
:
CURLOPT_URL => 'https://www.googleapis.com/drive/v3/files/'.$fileId.'/permissions?fields=mimeType',
响应是:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "invalidParameter",
"message": "Invalid field selection mimeType",
"locationType": "parameter",
"location": "fields"
}
],
"code": 400,
"message": "Invalid field selection mimeType"
}
}
我真的不知道这个 fields
参数是如何工作的,因为我认为 webViewLink
、name
和 mimeType
是正确的字段,它们都在here, anyone did this before? I'm not gonna use the google-api-php-client 因为它的大小太大(>20M)。
- 您想使用 php 检索
webViewLink
。
- 您想使用 curl 实现此目的而不使用 php 的 googleapis。
- 您已经使用过驱动器API。
如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。
问题:
- 在您的情况下,您正在尝试从权限方法中检索
webViewLink
:在云端硬盘 API 中创建。不幸的是,Permissions: create 方法没有 file
的字段。这样,webViewLink
、name
和mimeType
的字段就不能直接从Permissions:create. 的方法中获取了。
- 关于
I really don't know how can this fields parameter works, cause I think webViewLink, name and mimeType are correct fields, they all describe in [here](https://developers.google.com/drive/api/v3/reference/files#resource-representations), anyone did this before?
,
- 在这种情况下,请检查Permissions。你可以在那里看到字段参数。
根据以上情况,出现这样的错误。
解决方法 1:
还好,webViewLink
的格式是常量。使用它,您可以使用如下文件 ID 直接检索 webViewLink
。
$webViewLink = 'https://drive.google.com/file/d/'.$fileId.'/view?usp=drivesdk';
解决方法 2:
如果要使用API检索webViewLink
,使用Files: get in Drive API的方法如何?示例脚本如下
示例脚本:
function getWebViewLink($fileId, $accessToken){
$ch = curl_init();
$options = [
CURLOPT_URL => 'https://www.googleapis.com/drive/v3/files/'.$fileId.'?fields=webViewLink',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization:Bearer '.$accessToken],
];
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
return $result;
}
参考:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。
将文件上传到 GoogleDrive 后,我可以从响应中得到一个 fileId
,然后我将 fileId
传递给以下函数:
public function createShareLink($fileId, $accessToken){
$ch = curl_init();
$options = [
CURLOPT_URL => 'https://www.googleapis.com/drive/v3/files/'.$fileId.'/permissions',
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => json_encode(['type'=>'anyone', 'role'=>'reader',]),
CURLOPT_HTTPHEADER => [
'Authorization:Bearer '.$accessToken,
'Content-Type:application/json',
],
//In case you're in Windows, sometimes will throw error if not set SSL verification to false
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
];
//In case you need a proxy
//$options[CURLOPT_PROXY] = 'http://127.0.0.1:1087';
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
return $result;
}
确实有效,而且 returns json:
{
"kind": "drive#permission",
"id": "anyoneWithLink",
"type": "anyone",
"role": "reader",
"allowFileDiscovery": false
}
GoogleDrive中的文件确实变成了共享状态:
但是在响应json中没有share link,所以我查看了文档,在here中,你可以找到fields
参数(见截图以下):
单击 partial response 会将您重定向到一个页面,其中包含一些有关如何将值传递给 fileds
参数的示例。
我按照示例将 webViewLink
作为值传递给 fields
,如下所示:
CURLOPT_URL => 'https://www.googleapis.com/drive/v3/files/'.$fileId.'/permissions?fields=webViewLink',
但是响应错误:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "invalidParameter",
"message": "Invalid field selection webViewLink",
"locationType": "parameter",
"location": "fields"
}
],
"code": 400,
"message": "Invalid field selection webViewLink"
}
}
我试过了id
:
CURLOPT_URL => 'https://www.googleapis.com/drive/v3/files/'.$fileId.'/permissions?fields=id',
响应是:
{
"id": "anyoneWithLink"
}
我试过了 name
:
CURLOPT_URL => 'https://www.googleapis.com/drive/v3/files/'.$fileId.'/permissions?fields=name',
响应是:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "invalidParameter",
"message": "Invalid field selection name",
"locationType": "parameter",
"location": "fields"
}
],
"code": 400,
"message": "Invalid field selection name"
}
}
我试过了 mimeType
:
CURLOPT_URL => 'https://www.googleapis.com/drive/v3/files/'.$fileId.'/permissions?fields=mimeType',
响应是:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "invalidParameter",
"message": "Invalid field selection mimeType",
"locationType": "parameter",
"location": "fields"
}
],
"code": 400,
"message": "Invalid field selection mimeType"
}
}
我真的不知道这个 fields
参数是如何工作的,因为我认为 webViewLink
、name
和 mimeType
是正确的字段,它们都在here, anyone did this before? I'm not gonna use the google-api-php-client 因为它的大小太大(>20M)。
- 您想使用 php 检索
webViewLink
。 - 您想使用 curl 实现此目的而不使用 php 的 googleapis。
- 您已经使用过驱动器API。
如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。
问题:
- 在您的情况下,您正在尝试从权限方法中检索
webViewLink
:在云端硬盘 API 中创建。不幸的是,Permissions: create 方法没有file
的字段。这样,webViewLink
、name
和mimeType
的字段就不能直接从Permissions:create. 的方法中获取了。
- 关于
I really don't know how can this fields parameter works, cause I think webViewLink, name and mimeType are correct fields, they all describe in [here](https://developers.google.com/drive/api/v3/reference/files#resource-representations), anyone did this before?
,- 在这种情况下,请检查Permissions。你可以在那里看到字段参数。
根据以上情况,出现这样的错误。
解决方法 1:
还好,webViewLink
的格式是常量。使用它,您可以使用如下文件 ID 直接检索 webViewLink
。
$webViewLink = 'https://drive.google.com/file/d/'.$fileId.'/view?usp=drivesdk';
解决方法 2:
如果要使用API检索webViewLink
,使用Files: get in Drive API的方法如何?示例脚本如下
function getWebViewLink($fileId, $accessToken){
$ch = curl_init();
$options = [
CURLOPT_URL => 'https://www.googleapis.com/drive/v3/files/'.$fileId.'?fields=webViewLink',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization:Bearer '.$accessToken],
];
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
return $result;
}
参考:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。