У меня есть эта иерархия на моем диске:
-- logo1.png | |-- logo2.png | -- myFolder | | | --logo3.png | | -- myPrivateFolder | --anotherPrivateFolder | -- logo4.png
Я использую этот простой скрипт для перечисления моих файлов:
$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;
В качестве параметра я выдаю идентификатор исключенных папок после их получения:
$parameters = array('q' => "'not 'myFolderID' in parents and not 'myprivateFolderID' in parents");
Когда я запускаю свой сценарий, я ожидаю получить logo1.png
и logo2.png
, так как я исключил myFolder
и myPrivateFolder
, но также получаю logo4.png
так как у него есть anotherPrivateFolder
а myPrivateFolder
– дедушка. Я понял, что API Диска Google не имеет понятия древовидной структуры, поэтому я сделал рекурсивную функцию для распространения по всем подкаталогам исключенных папок. В этом случае мой скрипт получит все ID папок ниже myFolder
и myPrivateFolder
. Вот моя функция:
$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'"))
в$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'"))
В результате у меня есть массив, содержащий идентификатор моей исключенной папки и всех ее подкаталогов. Затем я создаю запрос, для каждого идентификатора исключенной папки я добавляю … и «newsubdirectoryID» не в родителях. При запуске запроса на диске, содержащем сотни подпапок, у меня есть ошибка 413, говорящая о том, что мой запрос клиента слишком велик. Как я могу без исключения исключить папку и весь ее контент?
Спасибо заранее за любую помощь
РЕДАКТИРОВАТЬ :
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); } }