Google 驱动器 API 无法为可重复使用的上传设置权限
Google Drive API can't set permissions with reusable upload
当我像这样进行基本文件上传并设置权限时,效果很好:
$file = $service->files->create($fileMetadata, array(
'data' => $content,
'mimeType' => $mimeType,
'uploadType' => 'multipart',
'fields' => 'id'));
$permissions = new Google_Service_Drive_Permission(array(
"role" => "reader",
"type" => "anyone",
));
$setPermission = $service->permissions->create($file->id, $permissions);
但是当我上传一个分成块的大文件并使用可恢复的上传类型时,文件没有设置权限并且我没有收到任何错误:
$service = new Google_Service_Drive($client);
$file = new Google_Service_Drive_DriveFile();
$file->title = $fileName;
$file->name = $fileName;
$chunkSizeBytes = 1 * 1024 * 1024;
$mimeType = mime_content_type($fullpath);
// Call the API with the media upload, defer so it doesn't immediately return.
$client->setDefer(true);
$request = $service->files->create($file);
// Create a media file upload to represent our upload process.
$media = new Google_Http_MediaFileUpload(
$client,
$request,
$mimeType,
null,
true,
$chunkSizeBytes
);
$media->setFileSize(filesize($fullpath));
// Upload the various chunks. $status will be false until the process is complete.
$status = false;
$handle = fopen($fullpath, "rb");
while (!$status && !feof($handle)) {
$chunk = fread($handle, $chunkSizeBytes);
$status = $media->nextChunk($chunk);
}
// The final value of $status will be the data from the API for the object that has been uploaded.
$result = false;
if($status != false) {
$result = $status;
error_log($result->id);
}
fclose($handle);
$permissions = new Google_Service_Drive_Permission(array(
"role" => "reader",
"type" => "anyone"
));
$setPermission = $service->permissions->create($result->id, $permissions);
对我做错了什么有什么建议吗?
我和你有过同样的情况。在这种情况下,当使用断点续传上传文件后,使用 $res = $service->files->get($result->id);
检索文件信息时,将无错返回 {}
的空对象。我认为这就是问题的原因。
因此,我使用了以下解决方法。在此解决方法中,在使用可恢复上传上传文件后,我再次检索了 $client
。这样, $res = $service->files->get($result->id);
在文件上传后工作。当这个用于你的脚本时,请修改如下。
发件人:
fclose($handle);
$permissions = new Google_Service_Drive_Permission(array(
"role" => "reader",
"type" => "anyone"
));
$setPermission = $service->permissions->create($result->id, $permissions);
收件人:
fclose($handle);
$client = getClient(); // <--- Added
$service = new Google_Service_Drive($client); // <--- Added
$permissions = new Google_Service_Drive_Permission(array(
"role" => "reader",
"type" => "anyone"
));
$setPermission = $service->permissions->create($result->id, $permissions);
getClient()
用于检索 $client
。所以请根据您的实际情况修改此部分。
注:
- 此答案假定您的
$client
可以创建上传文件的权限。请注意这一点。
$client->setDefer(true);导致了这个问题。这就是当您创建 Google 客户端的新实例时它起作用的原因。
另一个修复可能是做 $client->setDefer(false);上传文件后。
当我像这样进行基本文件上传并设置权限时,效果很好:
$file = $service->files->create($fileMetadata, array(
'data' => $content,
'mimeType' => $mimeType,
'uploadType' => 'multipart',
'fields' => 'id'));
$permissions = new Google_Service_Drive_Permission(array(
"role" => "reader",
"type" => "anyone",
));
$setPermission = $service->permissions->create($file->id, $permissions);
但是当我上传一个分成块的大文件并使用可恢复的上传类型时,文件没有设置权限并且我没有收到任何错误:
$service = new Google_Service_Drive($client);
$file = new Google_Service_Drive_DriveFile();
$file->title = $fileName;
$file->name = $fileName;
$chunkSizeBytes = 1 * 1024 * 1024;
$mimeType = mime_content_type($fullpath);
// Call the API with the media upload, defer so it doesn't immediately return.
$client->setDefer(true);
$request = $service->files->create($file);
// Create a media file upload to represent our upload process.
$media = new Google_Http_MediaFileUpload(
$client,
$request,
$mimeType,
null,
true,
$chunkSizeBytes
);
$media->setFileSize(filesize($fullpath));
// Upload the various chunks. $status will be false until the process is complete.
$status = false;
$handle = fopen($fullpath, "rb");
while (!$status && !feof($handle)) {
$chunk = fread($handle, $chunkSizeBytes);
$status = $media->nextChunk($chunk);
}
// The final value of $status will be the data from the API for the object that has been uploaded.
$result = false;
if($status != false) {
$result = $status;
error_log($result->id);
}
fclose($handle);
$permissions = new Google_Service_Drive_Permission(array(
"role" => "reader",
"type" => "anyone"
));
$setPermission = $service->permissions->create($result->id, $permissions);
对我做错了什么有什么建议吗?
我和你有过同样的情况。在这种情况下,当使用断点续传上传文件后,使用 $res = $service->files->get($result->id);
检索文件信息时,将无错返回 {}
的空对象。我认为这就是问题的原因。
因此,我使用了以下解决方法。在此解决方法中,在使用可恢复上传上传文件后,我再次检索了 $client
。这样, $res = $service->files->get($result->id);
在文件上传后工作。当这个用于你的脚本时,请修改如下。
发件人:
fclose($handle);
$permissions = new Google_Service_Drive_Permission(array(
"role" => "reader",
"type" => "anyone"
));
$setPermission = $service->permissions->create($result->id, $permissions);
收件人:
fclose($handle);
$client = getClient(); // <--- Added
$service = new Google_Service_Drive($client); // <--- Added
$permissions = new Google_Service_Drive_Permission(array(
"role" => "reader",
"type" => "anyone"
));
$setPermission = $service->permissions->create($result->id, $permissions);
getClient()
用于检索$client
。所以请根据您的实际情况修改此部分。
注:
- 此答案假定您的
$client
可以创建上传文件的权限。请注意这一点。
$client->setDefer(true);导致了这个问题。这就是当您创建 Google 客户端的新实例时它起作用的原因。
另一个修复可能是做 $client->setDefer(false);上传文件后。