2

I am trying to get list of all folders which i can see in google drive. So I can check a folder, is allready exist or not. If not then i can create one. But Google Drive PHP api returning empty list of folders, While I can see lots of folders in my google drive( via browser ).

Here is class, Which I am using:-

<?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
    }

}

?>

But its returning this response:-

  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 ( ) )

Please tell me where I am wrong?

pankaj agarwal
  • 171
  • 2
  • 15

1 Answers1

3

You may want to first check this related SO post wherein it was mentioned that, for security reasons, there's no method to list all files in a user Drive account.

Also, Drive API grants access only to two classes of files:

  • Files that a user has created with a given Drive app
  • Files that a user opens with a given Drive app

Reading through the suggested link, you may need to manage sharing of files and folders in Google Drive. And, in addition to managing permissions through the API using the Permissions collection, apps can display a standard Google Drive sharing dialog to let users share files.

With permissions, you may then proceed using Files.list and specify in your query parameter:

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

That should return the folders in the root directory. Use the Try-it to test it.

You may want to check the following links for more information:

Teyam
  • 7,686
  • 3
  • 15
  • 22