가능한 한 적은 API 호출로 주어진 폴더의 하위 트리에있는 각 파일 및 폴더에 대한 기본 정보 (ID, 제목, 마임 유형)를 얻는 방법은 무엇입니까? 즉. 모든 하위 폴더의 세부 정보를 다운로드하기 위해 API를 호출하지 않습니까?Google 드라이브 PHP : 폴더의 전체 하위 트리를 나열하는 방법
일부 비 계층 적 특성 (예 : 소유자)이있는 모든 파일을 읽고 클라이언트 스크립트에서 트리 구조를 작성하는 해결 방법을 발견했습니다. 불행히도 내 파일은 한 소유자 (응용 프로그램)에서 가져온 것이므로이 방법으로는 처리 할 수 없습니다.
확인, 여기에 몇 가지 사용 사례에 대한 충분한 될 수있는 재귀-여러 API를 호출 방법에 대한 예제 코드입니다. 하지만 더 나은 개념을 찾을 싶습니다 (이 구현을 논의하기 위해 아니지만, 또 다른 방법은, 어떻게 각 폴더에 대한 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;
}
}
Google의 제품 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