谷歌驱动器php api没有返回谷歌驱动器文件夹

时间:2017-06-28 13:02:03

标签: php google-api google-drive-api google-api-php-client

我正在尝试获取我在谷歌驱动器中可以看到的所有文件夹的列表。 所以我可以检查一个文件夹,是否已经存在。如果没有,那么我可以创建一个。 但谷歌驱动PHP API返回空文件夹列表,虽然我可以在我的谷歌驱动器中看到很多文件夹(通过浏览器)。

这是我正在使用的课程: -

<?php

class gdrive{

    //credentials (get those from google developer console https://console.developers.google.com/)

var $clientId = "1047996724365-MyID.apps.googleusercontent.com";

var $clientSecret = "MySecret";
var $redirectUri = 'http://localhost/google_drive2/gdrive_upload.php';  

    //variables
    var $fileRequest;
    var $mimeType;
    var $filename;
    var $path;
    var $client;


    function __construct(){
        require_once 'src/Google/autoload.php'; // get from here https://github.com/google/google-api-php-client.git 
        require_once 'src/Google/Client.php'; // get from here https://github.com/google/google-api-php-client.git 
        //require_once 'src/Google/Drive.php'; // get from here https://github.com/google/google-api-php-client.git 

        $this->client = new Google_Client();
    }


    function initialize(){
        //echo "<br/>initializing class\n";
        $client = $this->client;

        $client->setClientId($this->clientId);
        $client->setClientSecret($this->clientSecret);
        $client->setRedirectUri($this->redirectUri);
        $client->addScope(
    "https://www.googleapis.com/auth/drive", 
    "https://www.googleapis.com/auth/drive.appfolder");


        $refreshToken = file_get_contents(__DIR__ . "/token.txt"); 

        $client->refreshToken($refreshToken);
        $tokens = $client->getAccessToken();

        $client->setAccessToken($tokens);
        //$client->setDefer(true);
        $this->processFile();

    }

    function processFile(){

        $fileRequest = $this->fileRequest;
        //echo "Process File $fileRequest\n";
        $path_parts = pathinfo($fileRequest);
        $this->path = $path_parts['dirname'];
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $this->mimeType = finfo_file($finfo, $fileRequest);
        finfo_close($finfo);

        //echo "Mime type is " . $this->mimeType . "\n";

        $this->upload();

    }


/**
* Get the folder ID if it exists, if it doesnt exist, create it and return the ID
*
* @param Google_DriveService $service Drive API service instance.
* @param String $folderName Name of the folder you want to search or create
* @param String $folderDesc Description metadata for Drive about the folder (optional)
* @return Google_Drivefile that was created or got. Returns NULL if an API error occured
*/
function getFolderExistsCreate($service, $folderName, $folderDesc) {
error_reporting(E_ALL); ini_set('display_errors', 1);
    $parameters['q'] = "mimeType='application/vnd.google-apps.folder' and trashed=false";
    $files = $service->files->listFiles($parameters);
    $found = false;
    // Go through each one to see if there is already a folder with the specified name

print_r($files);exit; /****************RESPONSE ON THIS LINE *********/


    foreach ($files['items'] as $item) {
        if ($item['title'] == $folderName) {
            $found = true;
            return $item['id'];
            break;
        }
    }
    // If not, create one
    if ($found == false) {
        $folder = new Google_Service_Drive_DriveFile();
        //Setup the folder to create
        $folder->setTitle($folderName);
        if(!empty($folderDesc))
            $folder->setDescription($folderDesc);
        $folder->setMimeType('application/vnd.google-apps.folder');
        //Create the Folder
        try {
            $createdFile = $service->files->insert($folder, array(
                'mimeType' => 'application/vnd.google-apps.folder',
                ));
            // Return the created folder's id
            echo  $createdFile->id;
        } catch (Exception $e) {
            print "An error occurred: " . $e->getMessage();
        }
    }





exit;

/*
        $client = new Google_Client();
        $client->setClientId($this->clientId);
        $client->setClientSecret($this->clientSecret);
        $client->setRedirectUri($this->redirectUri);

        $refreshToken = file_get_contents(__DIR__ . "/token.txt"); 

        $client->refreshToken($refreshToken);
        $tokens = $client->getAccessToken();
        $client->setAccessToken($tokens);
        $client->setDefer(true);

        $service = new Google_Service_Drive($client);
    // List all user files (and folders) at Drive root
    $parameters['q'] = "mimeType='application/vnd.google-apps.folder' and trashed=false";
    $files = $service->files->listFiles($parameters);
    print_r($files);exit;
*/
    $found = false;
    // Go through each one to see if there is already a folder with the specified name
    foreach ($files['items'] as $item) {
        if ($item['title'] == $folderName) {
            $found = true;
            return $item['id'];
            break;
        }
    }
    // If not, create one
    if ($found == false) {
        $folder = new Google_Service_Drive_DriveFile();
        //Setup the folder to create
        $folder->setTitle($folderName);
        if(!empty($folderDesc))
            $folder->setDescription($folderDesc);
        $folder->setMimeType('application/vnd.google-apps.folder');
        //Create the Folder
        try {
            $createdFile = $service->files->insert($folder, array(
                'mimeType' => 'application/vnd.google-apps.folder',
                ));
            // Return the created folder's id
            return $createdFile->id;
        } catch (Exception $e) {
            print "An error occurred: " . $e->getMessage();
        }
    }
}

    function upload(){
        $client = $this->client;
        $service = new Google_Service_Drive($client);

    $folderName='aaaaaaa';
     $folderDesc='Folder Desc';

// Setup the folder you want the file in, if it is wanted in a folder
    if(isset($folderName)) {
        if(!empty($folderName)) {
            //$parent = new Google_Service_Drive_ParentReference();
            //$parent->setId(getFolderExistsCreate($service, $folderName, $folderDesc));
            $parent=$this->getFolderExistsCreate($service, $folderName, $folderDesc);
            print_r($parent);exit;
            $file->setParents(array($parent));
        }
    }




        $file = new Google_Service_Drive_DriveFile(array(
  'name' => $this->filename));
        $file->title = "a.txt";
        $chunkSizeBytes = 1 * 1024 * 1024;

        $fileRequest = $this->fileRequest;
        $mimeType = $this->mimeType;

        //$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($fileRequest));

        // Upload the various chunks. $status will be false until the process is
        // complete.
        $status = false;
        $handle = fopen($fileRequest, "rb");

        // start uploading      
        //echo "Uploading: " . $this->filename . "\n";  

        $filesize = filesize($fileRequest);

        // while not reached the end of file marker keep looping and uploading chunks
        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;
        }

        fclose($handle);
        // Reset to the client to execute requests immediately in the future.
        $client->setDefer(false);   
        ?>https://drive.google.com/open?id=<?= $result->id ?><?php
    }

}

?>

但它回复了这个回应: -

  Google_Service_Drive_FileList Object ( [collection_key:protected] => files [filesType:protected] => Google_Service_Drive_DriveFile [filesDataType:protected] => array [kind] => drive#fileList [nextPageToken] => [internal_gapi_mappings:protected] => Array ( ) [modelData:protected] => Array ( [incompleteSearch] => [files] => Array ( ) ) [processed:protected] => Array ( ) )

请告诉我哪里错了?

1 个答案:

答案 0 :(得分:2)

您可能需要先查看此相关的SO post,其中提到的是,出于安全原因,我们无法列出用户云端硬盘帐户中的所有文件。

此外,Drive API仅授予对两类文件的访问权限:

  • 用户使用给定云端硬盘应用创建的文件
  • 用户使用给定的云端硬盘应用打开的文件

通过建议的链接,您可能需要manage sharing Google云端硬盘中的文件和文件夹。此外,除了使用Permissions collection通过API管理权限外,应用还可以显示标准的Google云端硬盘共享对话框,以便用户共享文件。

有了权限,您可以继续使用Files.list并在查询参数中指定:

('root' in parents and mimeType = 'application/vnd.google-apps.folder')

那应该返回根目录中的文件夹。使用Try-it进行测试。

您可能需要查看以下链接以获取更多信息: