web-dev-qa-db-ja.com

グーグルドライブAPIを使用してファイルとフォルダを移動する方法は?

GoogleドライブAPIを使用して次のような簡単なタスクを実行しようとしています

  1. フォルダ間でファイルを移動する。
  2. リストアイテム

フォルダの移動。

私が知る限り、GoogleドライブAPIはフォルダ間でファイルを移動する方法を提供していません。

/ parentおよび/ children APIを使用すると、ファイルの親フォルダーを指定できますが、フォルダーに対しては機能しません。さらに、ファイルに関連付けられている親属性は、ファイルをそのフォルダーの下に移動しません。親属性をファイルに関連付けるだけです(私の場合はまったく役に立ちません)

16
NitinJ

FILE-AをFOLDER-1からFOLDER-2に移動するには、 https://developers.google.com/drive/v2/reference/parents でdeleteおよびadd呼び出しを使用してFOLDERを削除します。 -1を親として、FOLDER-2を追加します。

更新された親配列を使用してファイルにパッチを適用することもできます。

9
pinoyyid

ドライブAPIV3には次のものがあります。

フォルダ間でファイルを移動する

既存のファイルの親を追加または削除するには、files.updateメソッドでaddParentsおよび> removeParentsクエリパラメーターを使用します。

両方のパラメーターを使用して、ファイルをあるフォルダーから別のフォルダーに移動できます。 https://developers.google.com/drive/v3/web/folder#inserting_a_file_in_a_folder

16
intotecho

パッチ および 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();
  }
}
4
Hafez Divandari

実際には、Javascriptでリクエストを設定するだけで、実際には1つのステップで実行できます。

体は持っている必要があります:

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

このサンプルコードは、Google Drive APIv3を使用しています。

Gfk = Googleファイルキー(ファイルまたはフォルダーのIDにすることができます)。

方法:

  • moveTo |ファイル/フォルダーを最初の親フォルダーから指定された宛先フォルダーに移動します。ファイル/フォルダーは元の最初の親フォルダーから削除されます。
  • addParentsおよびremoveParents | 1つだけ追加または削除するか、親を移動します。 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);
    }
}
0
Francisco Luz