如何獲得給定文件夾子樹中每個文件和文件夾的基本信息(ID,標題,MIME類型至少)儘可能少的API調用?即。不要調用API來下載每個子文件夾的詳細信息?谷歌驅動器PHP的:如何列出文件夾的完整子樹
我找到了解決方法來讀取所有具有某些非分層特徵(例如,所有者)的文件並在客戶端腳本中構建樹結構。我的文件不幸全部來自一個所有者(應用程序),所以我不能這樣做。
好的,下面是recursion-multiple-api-calls方法的示例代碼,對於某些用例來說,這可能足夠了。不過,我想找到更好的概念(不討論這個實現,而是另闢蹊徑,如何不叫每個文件夾的API):
class Foo {
const FOLDER_MIME_TYPE = 'application/vnd.google-apps.folder';
public function getSubtreeForFolder($parentId, $sort=true)
{
$service = $this->createCrmGService();
// A. folder info
$file = $service->files->get($parentId);
$ret = array(
'id' => $parentId,
'name' => $file->getTitle(),
'description' => $file->getDescription(),
'mimetype' => $file->getMimeType(),
'is_folder' => true,
'children' => array(),
'node' => $file,
);
if ($ret['mimetype'] != self::FOLDER_MIME_TYPE) {
throw new Exception(_t("{$ret['name']} is not a folder."));
}
$items = $this->findAllFiles($queryString='trashed = false', $parentId, $fieldsFilter='items(alternateLink,description,fileSize,id,mimeType,title)', $service);
foreach ($items as $child)
{
if ($this->isFolder($child))
{
$ret['children'][] = $this->getSubtreeForFolder($child->id, $sort);
}
else
{
// B. file info
$a['id'] = $child->id;
$a['name'] = $child->title;
$a['description'] = $child->description;
$a['is_folder'] = false;
$a['url'] = $file->getDownloadUrl();
$a['url_detail'] = $child->getAlternateLink();
$a['versionLabel'] = false; //FIXME
$a['node'] = $child;
if (!$a['versionLabel']) {
$a['versionLabel'] = '1.0'; //old files compatibility hack
}
$ret['children'][] = $a;
}
}
if ($sort && isset($ret['children']))
{
if ($sort === true) {
$sort = create_function('$a, $b', 'if ($a[\'name\'] == $b[\'name\']) return 0; return strcasecmp($a[\'name\'], $b[\'name\']);');
}
usort($ret['children'], $sort);
}
return $ret;
}
public function findAllFiles($queryString, $parentId=false, $fieldsFilter='items(id,title)', $service = false)
{
if (!$service) $service = $this->createCrmGService();
$result = array();
$pageToken = NULL;
if ($parentId) {
$queryString .= ($queryString ? ' AND ' : '') . "'{$parentId}' in parents";
}
do {
try {
$parameters = array('q' => $queryString);
if ($fieldsFilter) $parameters['fields'] = $fieldsFilter;
if ($pageToken) {
$parameters['pageToken'] = $pageToken;
}
$files = $service->files->listFiles($parameters);
$result = array_merge($result, $files->getItems());
$pageToken = $files->getNextPageToken();
} catch (Exception $e) {
print "An error occurred: " . $e->getMessage();
$pageToken = NULL;
}
} while ($pageToken);
return $result;
}
/**
* @param Google_DriveFile $file
* @return boolean, jestli je $file slozka.
*/
protected function isFolder($file)
{
return $file->getMimeType() == self::FOLDER_MIME_TYPE;
}
}
谷歌的產品API一般都有非常好的文檔。從此處開始:https://developers.google.com/drive/quickstart-php和https://developers.google.com/drive/v1/reference/files/get。 – DontVoteMeDown
謝謝,但我真的閱讀這個文檔,並提出這個問題,因爲我還沒有找到解決方案。我錯過了什麼嗎? – ooouuiii
我這麼認爲。查看這個參考頁面:https://developers.google.com/drive/v2/reference/files/list,它顯示瞭如何從文件列表中獲得響應(完整):https://developers.google。 com/drive/v2/reference/files#resource – DontVoteMeDown