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);上传文件后。