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);
}
}
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