Google drive PHP API: unable to insert files or folders into subfolders

匿名 (未验证) 提交于 2019-12-03 10:24:21

问题:

I have been struggling for quite a while now; via Google drives PHP API, I am able to create a sub folder or add files to an existing folder, But trying to place another sub folder or a file within a sub folder, seems impossible.

After research, I came across the Children function, but don't understand how to apply it, even after checking the Google documentation on this page: [https://developers.google.com/drive/v2/reference/children/insert][1]

The code I am using to add an image to a folder is:

//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'     ));

How would I proceed to upload this image to a specific subfolder, of which the ID is already determined?

Update: This is my combined code trying to:

  1. Create new_sub_folder1 with a parent of existing_folder, and store the returned ID
  2. 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);

But only new_sub_folder1 is created, and no file is added to this folder.

Update: The image is not added anywhere with this code. If I apply the same method to add .jpg to the existing_folder, by its ID, there are no issues. As soon as I use the sub_folder_1's ID, nothing is created - same method, different ID.

回答1:

Think of the folders as a train. Where your file (in this case a folder) has to be attached to 2 other train carts in order to work. The previous one is the parent and the next one is the child. If you specify a parent, but not a child for a folder then the train is incomplete. Sometimes it doesn't matter that the train is not complete, but if you want to use at least 2 levels of files then you must use parent and children references.

Your base folder may have root as its parent, then this folder could be the father of another sub-folder but it needs to be specified that it has children if you plan to use several level hierarchy for it to have a complete reference. So check this code:

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

A few things about the code: foldID is my kind of master or root folder. I create a new DriveFile, assign the folder specifications, assign a parent reference of my master folder, try to insert it, then specify a child reference with the children->insert(ID OF MY MASTER FOLDER, ID OF THE CREATED FOLDER). The reference now is complete, and the subfolder should be treated as such. For another sub-sub-folder, just rinse and repeat with the right parameters. I have a directory structure of approximately 6 or 7 level of folders and files, so it is possible so it's just to index the files correctly.



回答2:

My guess is that you've misunderstood how folders work in Drive. In Drive it's important to think of folders as being more like labels.

You say "I am not able to: existing_folder -> new_sub_folder1->new_file1, new_file2,"

In Drive, this is simply:-

  1. Create new_sub_folder1 with a parent of existing_folder, and store the returned ID
  2. Create new_file1 with a parent of new_sub_folder1, using the ID stored in step 1


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!