【问题标题】:Google drive PHP API: unable to insert files or folders into subfoldersGoogle drive PHP API:无法将文件或文件夹插入子文件夹
【发布时间】:2015-06-12 21:18:42
【问题描述】:

我已经挣扎了好一阵子了;通过 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 已确定的特定子文件夹?

更新: 这是我尝试的组合代码:

  1. 使用existing_folder 的父级创建new_sub_folder1,并存储返回的ID
  2. 使用第 1 步中存储的 ID 创建 new_file1 和 new_sub_folder1 的父级
$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,并没有将文件添加到这个文件夹中。

更新: 该代码不会在任何地方添加图像。如果我应用相同的方法将 .jpg 通过其 ID 添加到现有文件夹,则没有问题。只要我使用 sub_folder_1 的 ID,什么都不会创建 - 相同的方法,不同的 ID。

【问题讨论】:

  • 您能否再解释一下子文件夹的含义以及什么不起作用。你的代码对我来说看起来不错
  • 我能够:existing_folder -> new_file1、new_file2 等以及:existing_folder -> new_subfolder1、new_subfolder2 等。我不能:existing_folder -> new_sub_folder1->new_file1、new_file2 等. 这就是我想要实现的;将文件添加到子文件夹

标签: php file-upload google-drive-api google-api-php-client subdirectory


【解决方案1】:

把文件夹想象成一列火车。您的文件(在本例中为文件夹)必须附加到其他 2 个火车车厢才能工作。前一个是父母,下一个是孩子。如果您为文件夹指定了父级,但没有指定子级,则火车是不完整的。有时火车不完整并不重要,但如果您想使用至少 2 级文件,那么您必须使用父引用和子引用。

您的基本文件夹可能有根作为其父文件夹,那么此文件夹可能是另一个子文件夹的父文件夹,但如果您打算使用多个层次结构以获得完整的参考,则需要指定它有子文件夹.所以检查这段代码:

$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,分配文件夹规范,分配我的主文件夹的父引用,尝试插入它,然后使用 children->insert(我的主文件夹的 ID,创建的文件夹的 ID)指定一个子引用。现在参考已经完成,子文件夹应该被这样对待。对于另一个子文件夹,只需冲洗并使用正确的参数重复。我有一个大约 6 或 7 级文件夹和文件的目录结构,所以它是可能的,所以它只是正确地索引文件。

【讨论】:

    【解决方案2】:

    我的猜测是您误解了云端硬盘中文件夹的工作方式。在云端硬盘中,将文件夹视为更像标签是很重要的。

    你说“我不能:existing_folder -> new_sub_folder1->new_file1, new_file2”

    在云端硬盘中,这很简单:-

    1. 使用existing_folder 的父级创建new_sub_folder1,并存储返回的ID
    2. 使用第 1 步中存储的 ID 创建 new_file1 和 new_sub_folder1 的父级

    【讨论】:

    • 我已经尝试过类似的方法,从我新更新的问题中可以看出,但似乎不起作用。不确定我是否应该同时包含现有文件夹的 ID 和 sub_folder1 的 ID?
    • 您的代码看起来不错(鉴于我不阅读 PHP)。您不需要添加两个文件夹 ID,只需添加直接父级。您需要在您的问题中提供额外的调试。 1/文件 uniqid.jpg 是在任何地方创建的吗? 2/有什么错误吗? 3/你能提供一个http跟踪吗? 4/ "print_r($createdFile)" 的输出是什么?
    • 1. uniqid.jpg 不是在任何地方创建的。如果我应用相同的方法通过其 ID 将 uniqid.jpg 添加到现有文件夹,则没有问题。只要我使用 sub_folder_1 的 ID,就不会创建任何内容。 2. 没有错误。 3. 我不知道该怎么做,但会阅读并检查。 4. 什么都没有打印出来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多