2015-04-03 51 views
1

我试图使用服务在Amazon S3和Google Drive之间同步文件。Google Drive PHP API返回已删除的文件

我创建了一个服务帐户并与其电子邮件共享一个文件夹。 然后用我建立的自动服务,我创建了一些文件夹。

一切都很好,直到我试图从Google Drive UI中删除这些文件夹。他们从用户界面中消失,但我的服务仍然收到它们,就好像它们在场。 这里是我使用列出文件/文件夹代码:

private function retrieveAllGoogleDriveFiles($service) { 
    $result = array(); 
    $pageToken = NULL; 
    do { 
     try { 
      $parameters = array(); 
      if ($pageToken) { 
       $parameters['pageToken'] = $pageToken; 
      } 
      $parameters['q'] = "trashed=false"; 
      $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; 
} 

下面是我使用的授权机制:

 $credentials = new Google_Auth_AssertionCredentials(
      '[email protected]m', 
      array('https://www.googleapis.com/auth/drive'), 
      $private_key, 
      'notasecret',         
      'http://oauth.net/grant_type/jwt/1.0/bearer' 
     ); 

     $googleClient = new Google_Client(); 
     $googleClient->setAssertionCredentials($credentials); 
     if ($googleClient->getAuth()->isAccessTokenExpired()) { 
      $googleClient->getAuth()->refreshTokenWithAssertion(); 
     } 

     $googleService = new Google_Service_Drive($googleClient); 
     $files_list = $this->retrieveAllGoogleDriveFiles($googleService); 

其中一个用户删除一个文件/文件夹的情况下,从谷歌驱动器对我来说是真实的,我应该使同步回到S3并从那里删除文件/文件夹。

在此先感谢。

回答

0

当多个用户共享一个文件夹时,它是拥有者能够删除文件夹而不是其他用户的所有者。

本质上发生的是点击'删除',用户将其从他们的驱动器中删除(取消订阅),他们不删除该文件夹。这就是它出现在服务帐户文件列表中的原因。

一个可能的解决方案解决方案是做一个更改所有者,使非服务帐户拥有该文件。在这种情况下,删除真的会是垃圾/删除操作。但是,如果不理解您的用例/底层问题,则很难彻底解决问题。如果用户是企业/工作账户而不是私人/个人账户,其中一些可能会更容易。

+0

好的,有没有办法从用户界面中删除文件(作为真正的Gmail用户,而不是服务)?或者我怎么能知道用户是否删除它(取消订阅),因为对我而言,它应该表示它已被删除? – Vlado 2015-04-03 15:53:42

+1

您可能想重新考虑服务帐户是否是最佳方式。如果同步的终端是真实的Google帐户,那么您最好直接用OAuthing作为该帐户,而不要将服务帐户用作中介。 – pinoyyid 2015-04-03 19:40:51

相关问题