Google 驱动器 PHP API: 无法将文件或文件夹插入子文件夹
Google drive PHP API: unable to insert files or folders into subfolders
我已经挣扎了好久了;通过 Google 驱动器 PHP API,我能够创建一个子文件夹或将文件添加到现有文件夹,但似乎试图将另一个子文件夹或文件放入子文件夹中不可能的。
经过研究,我遇到了 Children 函数,但不明白如何应用它,即使在查看了此页面上的 Google 文档后也是如此:[https://developers.google.com/drive/v2/reference/children/insert][1]
我用来将图像添加到文件夹的代码是:
//Insert a file into client specific folder
$file = new Google_Service_Drive_DriveFile();
$file->setTitle(uniqid().'.jpg');
$file->setDescription('A test document');
$file->setMimeType('image/jpeg');
$data = file_get_contents('a.jpg');
$parent = new Google_Service_Drive_ParentReference(); //previously Google_ParentReference
$parent->setId($folderid); //$folderid = determined folder id
$file->setParents(array($parent));
$createdFile = $service->files->insert($file, array(
'data' => $data,
'mimeType' => 'image/jpeg',
'uploadType' => 'multipart'
));
如何将此图片上传到已确定 ID 的特定子文件夹?
更新:
这是我的组合代码,试图:
- Create new_sub_folder1 with a parent of existing_folder, and store the returned ID
- Create new_file1 with a parent of new_sub_folder1, using the ID stored in step 1
$service = new Google_Service_Drive($client);
//create sub folder
$folder = new Google_Service_Drive_DriveFile();
//Setup the folder to create
$folder->setTitle('new_sub_folder1');
$folder->setMimeType('application/vnd.google-apps.folder');
//Create the Folder within existing_folder
$parentid = '0B40CySVsd_Jaa1BzVUQwLUFyODA';
//Set the Parent Folder to existing_folder
$parent = new Google_Service_Drive_ParentReference(); //previously Google_ParentReference
$parent->setId($parentid);
$folder->setParents(array($parent));
//now create the client specific folder new_sub_folder
try {
$createdFile = $service->files->insert($folder, array(
'mimeType' => 'application/vnd.google-apps.folder',
));
// Return the created folder's id
$subfolderid = $createdFile->id;
echo $subfolderid;
return $createdFile->id;
} catch (Exception $e) {
print "An error occurred: " . $e->getMessage();
}
//Insert a file into client specific folder new_sub_folder
$file = new Google_Service_Drive_DriveFile();
$file->setTitle(uniqid().'.jpg');
$file->setDescription('A test document');
$file->setMimeType('image/jpeg');
$data = file_get_contents('a.jpg');
//Set the Parent Folder to new_sub_folder
$parent = new Google_Service_Drive_ParentReference(); //previously Google_ParentReference
$parent->setId($subfolderid);
$file->setParents(array($parent));
$createdFile = $service->files->insert($file, array(
'data' => $data,
'mimeType' => 'image/jpeg',
'uploadType' => 'multipart'
));
print_r($createdFile);
但是只创建了new_sub_folder1,没有文件添加到这个文件夹。
更新:
使用此代码不会在任何地方添加图像。如果我应用相同的方法通过其 ID 将 .jpg 添加到 existing_folder,则没有问题。一旦我使用 sub_folder_1 的 ID,就不会创建任何东西 - 相同的方法,不同的 ID。
我的猜测是您误解了文件夹在云端硬盘中的工作方式。在云端硬盘中,重要的是将文件夹视为更像标签。
你说"I am not able to: existing_folder -> new_sub_folder1->new_file1, new_file2,"
在云端硬盘中,这很简单:-
- 使用 existing_folder 的父级创建 new_sub_folder1,并存储返回的 ID
- 使用第 1 步中存储的 ID new_sub_folder1 的父级创建 new_file1
将文件夹想象成一列火车。您的文件(在本例中为文件夹)必须附加到其他 2 个火车车厢才能工作。上一个是parent,下一个是child。如果您为文件夹指定 parent,而不是 child,则序列不完整。有时火车不完整并不重要,但如果你想使用至少 2 级文件,那么你必须使用 parent 和 children 参考。
您的基础文件夹可能有根作为其 parent,那么这个文件夹可能是另一个 sub-folder 的父文件夹,但需要指定它有 children 如果您计划使用多个层次结构以使其具有完整的参考。所以检查这个代码:
$foldID=$id;
$folder4=new Google_Service_Drive_DriveFile();
$folder4->setTitle($folderName);
$folder4->setMimeType('application/vnd.google-apps.folder');
$parent4=new Google_Service_Drive_ParentReference();
$parent4->setId($foldID);
$folder4->setParents(array($parent4));
try {
$createdFile4 = $service->files->insert($folder4, array(
'mimeType' => 'application/vnd.google-apps.folder',
));
}
catch (Exception $e) {
print "An error occurred: " . $e->getMessage();
}
$foldId4=$createdFile4->id;
$newChild4=new Google_Service_Drive_ChildReference();
$newChild4->setId($createdFile4->id);
try{
$service->children->insert($foldID,$newChild4);
}
catch (Exception $e) {
print "An error occurred: " . $e->getMessage();
}
关于代码的一些事情:
foldID 是我的主文件夹或根文件夹。我创建了一个新的 DriveFile,分配了文件夹规格,分配了我的主文件夹的 parent 引用,尝试插入它,然后使用 children->insert(我的主文件夹的 ID,创建的文件夹的 ID)。现在参考已经完成,子文件夹也应该这样处理。对于另一个子 sub-folder,只需冲洗并使用正确的参数重复。我有一个大约 6 或 7 级文件夹和文件的目录结构,所以它是可能的,所以它只是正确地索引文件。
我已经挣扎了好久了;通过 Google 驱动器 PHP API,我能够创建一个子文件夹或将文件添加到现有文件夹,但似乎试图将另一个子文件夹或文件放入子文件夹中不可能的。
经过研究,我遇到了 Children 函数,但不明白如何应用它,即使在查看了此页面上的 Google 文档后也是如此:[https://developers.google.com/drive/v2/reference/children/insert][1]
我用来将图像添加到文件夹的代码是:
//Insert a file into client specific folder
$file = new Google_Service_Drive_DriveFile();
$file->setTitle(uniqid().'.jpg');
$file->setDescription('A test document');
$file->setMimeType('image/jpeg');
$data = file_get_contents('a.jpg');
$parent = new Google_Service_Drive_ParentReference(); //previously Google_ParentReference
$parent->setId($folderid); //$folderid = determined folder id
$file->setParents(array($parent));
$createdFile = $service->files->insert($file, array(
'data' => $data,
'mimeType' => 'image/jpeg',
'uploadType' => 'multipart'
));
如何将此图片上传到已确定 ID 的特定子文件夹?
更新: 这是我的组合代码,试图:
- Create new_sub_folder1 with a parent of existing_folder, and store the returned ID
- Create new_file1 with a parent of new_sub_folder1, using the ID stored in step 1
$service = new Google_Service_Drive($client);
//create sub folder
$folder = new Google_Service_Drive_DriveFile();
//Setup the folder to create
$folder->setTitle('new_sub_folder1');
$folder->setMimeType('application/vnd.google-apps.folder');
//Create the Folder within existing_folder
$parentid = '0B40CySVsd_Jaa1BzVUQwLUFyODA';
//Set the Parent Folder to existing_folder
$parent = new Google_Service_Drive_ParentReference(); //previously Google_ParentReference
$parent->setId($parentid);
$folder->setParents(array($parent));
//now create the client specific folder new_sub_folder
try {
$createdFile = $service->files->insert($folder, array(
'mimeType' => 'application/vnd.google-apps.folder',
));
// Return the created folder's id
$subfolderid = $createdFile->id;
echo $subfolderid;
return $createdFile->id;
} catch (Exception $e) {
print "An error occurred: " . $e->getMessage();
}
//Insert a file into client specific folder new_sub_folder
$file = new Google_Service_Drive_DriveFile();
$file->setTitle(uniqid().'.jpg');
$file->setDescription('A test document');
$file->setMimeType('image/jpeg');
$data = file_get_contents('a.jpg');
//Set the Parent Folder to new_sub_folder
$parent = new Google_Service_Drive_ParentReference(); //previously Google_ParentReference
$parent->setId($subfolderid);
$file->setParents(array($parent));
$createdFile = $service->files->insert($file, array(
'data' => $data,
'mimeType' => 'image/jpeg',
'uploadType' => 'multipart'
));
print_r($createdFile);
但是只创建了new_sub_folder1,没有文件添加到这个文件夹。
更新: 使用此代码不会在任何地方添加图像。如果我应用相同的方法通过其 ID 将 .jpg 添加到 existing_folder,则没有问题。一旦我使用 sub_folder_1 的 ID,就不会创建任何东西 - 相同的方法,不同的 ID。
我的猜测是您误解了文件夹在云端硬盘中的工作方式。在云端硬盘中,重要的是将文件夹视为更像标签。
你说"I am not able to: existing_folder -> new_sub_folder1->new_file1, new_file2,"
在云端硬盘中,这很简单:-
- 使用 existing_folder 的父级创建 new_sub_folder1,并存储返回的 ID
- 使用第 1 步中存储的 ID new_sub_folder1 的父级创建 new_file1
将文件夹想象成一列火车。您的文件(在本例中为文件夹)必须附加到其他 2 个火车车厢才能工作。上一个是parent,下一个是child。如果您为文件夹指定 parent,而不是 child,则序列不完整。有时火车不完整并不重要,但如果你想使用至少 2 级文件,那么你必须使用 parent 和 children 参考。
您的基础文件夹可能有根作为其 parent,那么这个文件夹可能是另一个 sub-folder 的父文件夹,但需要指定它有 children 如果您计划使用多个层次结构以使其具有完整的参考。所以检查这个代码:
$foldID=$id;
$folder4=new Google_Service_Drive_DriveFile();
$folder4->setTitle($folderName);
$folder4->setMimeType('application/vnd.google-apps.folder');
$parent4=new Google_Service_Drive_ParentReference();
$parent4->setId($foldID);
$folder4->setParents(array($parent4));
try {
$createdFile4 = $service->files->insert($folder4, array(
'mimeType' => 'application/vnd.google-apps.folder',
));
}
catch (Exception $e) {
print "An error occurred: " . $e->getMessage();
}
$foldId4=$createdFile4->id;
$newChild4=new Google_Service_Drive_ChildReference();
$newChild4->setId($createdFile4->id);
try{
$service->children->insert($foldID,$newChild4);
}
catch (Exception $e) {
print "An error occurred: " . $e->getMessage();
}
关于代码的一些事情: foldID 是我的主文件夹或根文件夹。我创建了一个新的 DriveFile,分配了文件夹规格,分配了我的主文件夹的 parent 引用,尝试插入它,然后使用 children->insert(我的主文件夹的 ID,创建的文件夹的 ID)。现在参考已经完成,子文件夹也应该这样处理。对于另一个子 sub-folder,只需冲洗并使用正确的参数重复。我有一个大约 6 或 7 级文件夹和文件的目录结构,所以它是可能的,所以它只是正确地索引文件。