23

我正在尝试使用 Google drive API 来执行简单的任务,例如

  1. 跨文件夹移动文件。
  2. 项目清单

移动文件夹。

据我所知,Google drive API 没有提供跨文件夹移动文件的方法。

可以使用 /parent 和 /children API 指定文件的父文件夹,但它不适用于文件夹。此外,与文件关联的父属性不会将其移动到该文件夹​​下。它只是将父属性与文件相关联(这对我的情况根本没有用)

4

6 回答 6

27

Drive API V3 有这个:

在文件夹之间移动文件

要为现有文件添加或删除父级,请在 files.update 方法上使用addParents和查询参数。removeParents

这两个参数都可用于将文件从一个文件夹移动到另一个文件夹: https ://developers.google.com/drive/v3/web/folder#inserting_a_file_in_a_folder

于 2016-06-17T12:04:00.607 回答
11

要将 FILE-A 从 FOLDER-1 移动到 FOLDER-2,您可以使用https://developers.google.com/drive/v2/reference/parents上的删除和添加调用来删除 FOLDER-1 作为父级并添加文件夹-2。

您还可以使用更新的父数组对文件进行修补。

于 2012-10-08T10:05:10.927 回答
5

这是使用PatchPHP 客户端库将文件移动到新文件夹的一步方法:

/**
 * Move a file.
 *
 * @param Google_Service_Drive_DriveFile $service Drive API service instance.
 * @param string $fileId ID of the file to move.
 * @param string $newParentId Id of the folder to move to.
 * @return Google_Service_Drive_DriveFile The updated file. NULL is returned if an API error occurred.
 */
function moveFile($service, $fileId, $newParentId) {
  try {
    $file = new Google_Service_Drive_DriveFile();

    $parent = new Google_Service_Drive_ParentReference();
    $parent->setId($newParentId);

    $file->setParents(array($parent));

    $updatedFile = $service->files->patch($fileId, $file);

    return $updatedFile;
  } catch (Exception $e) {
    print "An error occurred: " . $e->getMessage();
  }
}

更新:如果您想使用 Drive API v3,请使用此处记录的以下代码:

/**
 * Move a file.
 *
 * @param Google_Service_Drive_DriveFile $service Drive API service instance.
 * @param string $fileId ID of the file to move.
 * @param string $newParentId Id of the folder to move to.
 * @return Google_Service_Drive_DriveFile The updated file. NULL is returned if an API error occurred.
 */
function moveFile($service, $fileId, $newParentId) {
  try {

    $emptyFileMetadata = new Google_Service_Drive_DriveFile();
    // Retrieve the existing parents to remove
    $file = $service->files->get($fileId, array('fields' => 'parents'));
    $previousParents = join(',', $file->parents);
    // Move the file to the new folder
    $file = $service->files->update($fileId, $emptyFileMetadata, array(
      'addParents' => $newParentId,
      'removeParents' => $previousParents,
      'fields' => 'id, parents'));

    return $file;
  } catch (Exception $e) {
    print "An error occurred: " . $e->getMessage();
  }
}
于 2014-07-15T10:53:28.353 回答
4

您实际上仍然可以一步完成,只需在 Javascript 中设置请求即可:

身体必须有:

body.parents = [{ 'id': parentId }];

请求应该是:

var request = gapi.client.request({
  'path': 'drive/v2/files/'+fileId,
  'method': 'PUT',
  'params': {'uploadType': 'multipart', 'alt': 'json'}, 
  'headers': { 
    'Authorization': TOKEN
  },
  'body': body
});

然后执行:

request.execute(function(resp) { });
于 2014-02-12T16:53:45.040 回答
2

此示例代码使用 Google Drive API v3。

Gfk = Google 文件密钥(可以是文件或文件夹的 id)。

方法:

  • 移动到| 将文件/文件夹从其第一个父文件夹移动到给定的目标文件夹。文件/文件夹从其原始的第一个父文件夹中删除;
  • addParentsremoveParents | 仅添加或删除一个或移动父母。addParents不会删除任何原始父级,只会添加。
class Gfiles {
    private $service;

    public function setService(\Google_Client $client) : self {
        $this->service = (new \Google_Service_Drive($client))->files;
        return $this;
    }

    public function moveTo(string $gfk, string $to_gfk) : \Google_Service_Drive_DriveFile {
        $body = new \Google_Service_Drive_DriveFile();
        // Gets the first parent. You should further implement this if you wish a different behaviour.
        $from_gfk = $this->service->get($gfk, ['fields' => 'parents'])->parents[0];

        $this->service->update($gfk, $body, ['addParents' => $to_gfk]);
        $this->service->update($gfk, $body, ['removeParents' => $from_gfk]);
        return $this->service->get($gfk, ['fields' => 'parents']);
    }

    /**
     * $parents_gfk expects an array like ['gfk parent 1', 'gfk parent 2'].
     */
    private function updateParents(string $method, string $gfk, array $parents_gfk) : \Google_Service_Drive_DriveFile {
        $body = new \Google_Service_Drive_DriveFile();
        $parents = join(',', $parents_gfk);

        $this->service->update($gfk, $body, [$method => $parents]);
        return $this->service->get($gfk, ['fields' => 'parents']);
    }

    public function addParents(string $gfk, array $parents_gfk) : \Google_Service_Drive_DriveFile {
        return $this->updateParents('addParents', $gfk, $parents_gfk);
    }

    public function removeParents(string $gfk, array $parents_gfk) : \Google_Service_Drive_DriveFile {
        return $this->updateParents('removeParents', $gfk, $parents_gfk);
    }
}
于 2019-10-14T23:13:23.567 回答
0

我用过这段代码:

        File file =  driveService.files().get(fileId).execute()
        File targetFolder = driveService.files().get(folderId).execute()
        ParentReference newParent = new ParentReference()
        newParent.setSelfLink(targetFolder.getSelfLink())
        newParent.setParentLink(targetFolder.parents[0].getSelfLink())
        newParent.setId(folderId)
        newParent.setKind(targetFolder.getKind())
        newParent.setIsRoot(false)
        def parentsList = new ArrayList<ParentReference>()
        parentsList.add(newParent)
        file.setParents(parentsList)
        File updatedFile = driveService.files().update(fileId, file).execute()
于 2014-01-12T10:04:11.563 回答