2017-08-07 5 views
0

J'ai cette hiérarchie sur mon disque:liste des fichiers avec une exclusion des dossiers et tous ses petits-enfants sous-répertoires

-- logo1.png 
| 
|-- logo2.png 
| 
-- myFolder 
|  | 
|  --logo3.png 
| 
| 
-- myPrivateFolder 
     | 
     --anotherPrivateFolder 
      | 
      -- logo4.png 

J'utilise ce script simple à la liste de mes fichiers:

$client = new Google_Client(); 
$client->setAuthConfig($oauth_credentials); 
$client->setRedirectUri($redirect_uri); 
$client->addScope("https://www.googleapis.com/auth/drive"); 
$service = new Google_Service_Drive($client); 


$result = array(); 

try { 
    $parameters = array(
     'q' => "mimeType contains 'image/'", 
); 
    $files = $service->files->listFiles($parameters); 

    $result = array_merge($result, $files->getFiles()); 
} catch (Exception $e) { 
    print "Une erreur s'est produite : " . $e->getMessage(); 
} 
return $result; 

en tant que paramètre, je donne des dossiers ID exclus après les récupérer:

$parameters = array('q' => "'not 'myFolderID' in parents and not 'myprivateFolderID' in parents"); 

Lors de l'exécution de mon script, je n'attends t o obtenir logo1.png et logo2.png, puisque j'ai exclu myFolder et myPrivateFolder, mais je reçois également logo4.png car il a et myPrivateFolder est un grand-parent. J'ai compris que l'API Google Drive n'a pas de notion de structure arborescente, j'ai donc créé une fonction récursive à répartir dans tous les sous-répertoires d'un dossier exclu. Dans ce cas, mon script va obtenir tous les ID des dossiers ci-dessous myFolder et myPrivateFolder. Voici ma fonction:

$excluded_folders_id = array(); 
function retrieveAllChildren($service, $parameters) { 
    global $excluded_folders_id; 
    $results = array(); 
    $pageToken = NULL; 
    do{ 
    try { 
     if ($pageToken) { 
     $parameters['pageToken'] = $pageToken; 
     } 
     $files = $service->files->listFiles($parameters); 
     $results = array_merge($results, $files->getFiles()); 
     $pageToken = $files->getNextPageToken(); 
    } catch (Exception $e) { 
     print "Une erreur s'est produite : " . $e->getMessage(); 
     $pageToken = NULL; 
    } 
    }while($pageToken); 
    foreach ($results as $result) { 
    echo "=> New children to exclude : ".$result->name."\n"; 
    array_push($excluded_folders_id, $result->id); 
    retrieveAllChildren($service, array('q' => "'".$result->id."' in parents and mimeType = 'application/vnd.google-apps.folder'")); 
    } 
} 
retrieveAllChildren($service, array('q' => "name = 'myPrivateFolder'")) 

En conséquence, j'ai un tableau contenant l'ID de mon dossier exclu et tous ses sous-répertoires. Je construis ensuite la requête, pour chaque ID de dossier exclu, j'ajoute ... et 'newsubdirectoryID' pas dans les parents. Lors de l'exécution d'une requête sur un lecteur contenant des centaines de sous-dossiers, une erreur 413 s'affiche, indiquant que la requête de mon client est trop volumineuse. Comment puis-je exclure un dossier et tout son contenu, sans limite?

Nous vous remercions d'avance pour toute aide

EDIT:

function isFileInExcluded($service, $entity_id){ 

    global $excluded_folders_id; 

    $entityProperties = $service->files->get($entity_id,array('fields' => 'parents, id, name')); 

    If there is no more parents (so if on top of tree - no excluded encountered) 
    if($entityProperties->parents == NULL){ 
    return true; 
    } 
    // If file has excluded folder on upper part of tree 
    if(in_array($entityProperties->parents[0], $excluded_folders_id) == true){ 
    return true; 
    }else{ 
    // Spread acrosse upper parents 
    $parentProperties = $service->files->get($entityProperties->parents[0],array('fields' => 'parents, id, name')); 
    isFileInExcluded($service, $parentProperties->id); 
    } 
} 

Répondre

1

« Lorsque vous exécutez une requête sur un lecteur contenant des centaines de sous-dossiers, j'ai une erreur 413 disant que ma demande client est trop grand "

Vous aurez besoin de reconcevoir votre application.

Certaines approches que vous pouvez prendre: -

  1. Au lieu d'exclure, pouvez-vous pas trouver un paramètre inclusif qui est commun aux fichiers que vous souhaitez récupérer.
  2. Récupérez simplement toutes les images, puis filtrez celles qui sont requises dans votre fichier php.
  3. Donnez les images que vous souhaitez exclure d'un parent commun. Donc, par exemple. votre logo4.png est un enfant d'un autre dossier privé. Créez un nouveau dossier appelé say "excludeAllChildren", et faites de logo4.png un enfant de excludeAllChildren en plus d'un enfant d'anotherPrivateFolder.
+0

Bonjour, merci pour votre réponse, j'ai opté pour la deuxième solution. J'ai récupéré toutes les images et je vérifie l'ID de mes dossiers exclus si ça correspond :) – saperlipopette