Подтвердить что ты не робот

Как перемещать файлы и папки с помощью API Google Drive?

Я пытаюсь использовать API дисков Google для выполнения простых задач, таких как

  • Перемещение файлов по папкам.
  • Элемент списка

Перемещение папок.

Насколько я мог найти API для дисков Google, не предусмотрен способ перемещения файлов по папкам.

С родительской папкой /parent и/child API файла может быть указан, но она не работает для папки. Кроме того, родительский атрибут, связанный с файлом, не перемещает его под этой папкой. Он просто связывает родительский атрибут с файлом (что совсем не полезно для моего случая)

4b9b3361

Ответ 1

Чтобы переместить FILE-A из FOLDER-1 в FOLDER-2, вы можете использовать вызовы delete и add в https://developers.google.com/drive/v2/reference/parents, чтобы удалите FOLDER-1 в качестве родителя и добавьте FOLDER-2.

Вы также можете сделать патч в файле с обновленным массивом родителей.

Ответ 2

В драйвере API V3 есть следующее:

Перемещение файлов между папками

Чтобы добавить или удалить родителей для выходящего файла, используйте параметры запроса addParents и > removeParents в методе files.update.

Оба параметра могут использоваться для перемещения файла из одной папки в другую: https://developers.google.com/drive/v3/web/folder#inserting_a_file_in_a_folder

Ответ 3

Вы действительно можете сделать это за один шаг, просто установите запрос как таковой в 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) { });

Ответ 4

Ниже приведен один шаг для перемещения файла в новую папку с помощью Patch и Клиентская библиотека PHP:

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

Ответ 5

Я использовал этот код:

        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()

Ответ 6

В этом примере кода используется Google Drive API v3.

Gfk = Google File Key (может быть идентификатором файла или папки).

Методы:

  • moveTo | Перемещает файл/папку из своей первой родительской папки в заданную папку назначения. Файл/папка удаляется из исходной первой родительской папки;
  • addParents и removeParents | Только добавляет или удаляет один или переместить родителей. 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 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 = '';
        foreach($parents_gfk as $key => $parent) {
            if ($key === 0) {
                $parents .= $parent;
                continue;
            }
            $parents .= ",$parent";
        }

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