資料夾是指只包含中繼資料的檔案,可以用來整理檔案 以及「使用 Google 雲端硬碟」並具備以下屬性:
- 資料夾是採用 MIME 類型的檔案
application/vnd.google-apps.folder
,無副檔名。 - 別名
root
可用於參照任何檔案 ID 的根資料夾 而不是每個 Pod 的名稱
如要進一步瞭解雲端硬碟資料夾限制,請參閱檔案與 資料夾限制。
本指南說明如何執行一些與資料夾相關的基本工作。
建立資料夾
如要建立資料夾,請使用files.create
方法搭配 application/vnd.google-apps.folder
MIME 方法
type 和標題。下列程式碼範例顯示
如何使用用戶端程式庫建立資料夾:
Java
import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use of Drive's create folder API */ public class CreateFolder { /** * Create new folder. * * @return Inserted folder id if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ public static String createFolder() throws IOException { // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); // Build a new authorized API client service. Drive service = new Drive.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) .setApplicationName("Drive samples") .build(); // File's metadata. File fileMetadata = new File(); fileMetadata.setName("Test"); fileMetadata.setMimeType("application/vnd.google-apps.folder"); try { File file = service.files().create(fileMetadata) .setFields("id") .execute(); System.out.println("Folder ID: " + file.getId()); return file.getId(); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to create folder: " + e.getDetails()); throw e; } } }
Python
import google.auth from googleapiclient.discovery import build from googleapiclient.errors import HttpError def create_folder(): """Create a folder and prints the folder ID Returns : Folder Id Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for the application. """ creds, _ = google.auth.default() try: # create drive api client service = build("drive", "v3", credentials=creds) file_metadata = { "name": "Invoices", "mimeType": "application/vnd.google-apps.folder", } # pylint: disable=maybe-no-member file = service.files().create(body=file_metadata, fields="id").execute() print(f'Folder ID: "{file.get("id")}".') return file.get("id") except HttpError as error: print(f"An error occurred: {error}") return None if __name__ == "__main__": create_folder()
Node.js
/** * Create a folder and prints the folder ID * @return{obj} folder Id * */ async function createFolder() { // Get credentials and build service // TODO (developer) - Use appropriate auth mechanism for your app const {GoogleAuth} = require('google-auth-library'); const {google} = require('googleapis'); const auth = new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/drive', }); const service = google.drive({version: 'v3', auth}); const fileMetadata = { name: 'Invoices', mimeType: 'application/vnd.google-apps.folder', }; try { const file = await service.files.create({ requestBody: fileMetadata, fields: 'id', }); console.log('Folder Id:', file.data.id); return file.data.id; } catch (err) { // TODO(developer) - Handle error throw err; } }
PHP
use Google\Client; use Google\Service\Drive; function createFolder() { try { $client = new Client(); $client->useApplicationDefaultCredentials(); $client->addScope(Drive::DRIVE); $driveService = new Drive($client); $fileMetadata = new Drive\DriveFile(array( 'name' => 'Invoices', 'mimeType' => 'application/vnd.google-apps.folder')); $file = $driveService->files->create($fileMetadata, array( 'fields' => 'id')); printf("Folder ID: %s\n", $file->id); return $file->id; }catch(Exception $e) { echo "Error Message: ".$e; } }
.NET
using Google.Apis.Auth.OAuth2; using Google.Apis.Drive.v3; using Google.Apis.Services; namespace DriveV3Snippets { // Class to demonstrate use of Drive create folder API. public class CreateFolder { /// <summary> /// Creates a new folder. /// </summary> /// <returns>created folder id, null otherwise</returns> public static string DriveCreateFolder() { try { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredential credential = GoogleCredential.GetApplicationDefault() .CreateScoped(DriveService.Scope.Drive); // Create Drive API service. var service = new DriveService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "Drive API Snippets" }); // File metadata var fileMetadata = new Google.Apis.Drive.v3.Data.File() { Name = "Invoices", MimeType = "application/vnd.google-apps.folder" }; // Create a new folder on drive. var request = service.Files.Create(fileMetadata); request.Fields = "id"; var file = request.Execute(); // Prints the created folder id. Console.WriteLine("Folder ID: " + file.Id); return file.Id; } catch (Exception e) { // TODO(developer) - handle error appropriately if (e is AggregateException) { Console.WriteLine("Credential Not found"); } else { throw; } } return null; } } }
在特定資料夾中建立檔案
如要在特定資料夾中建立檔案,請使用 files.create
方法,然後在以下位置指定資料夾 ID:
parents
屬性。
parents
屬性會保留包含檔案所在上層資料夾的 ID。
在頂層資料夾中建立檔案時,可以使用 parents
屬性;
就好。
一個檔案只能有一個上層資料夾;無法指定多個父項 。
下列程式碼範例顯示如何在特定資料夾中建立檔案: 用戶端程式庫
Java
import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.FileContent; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; import java.util.Arrays; import java.util.Collections; /* Class to demonstrate Drive's upload to folder use-case. */ public class UploadToFolder { /** * Upload a file to the specified folder. * * @param realFolderId Id of the folder. * @return Inserted file metadata if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ public static File uploadToFolder(String realFolderId) throws IOException { // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); // Build a new authorized API client service. Drive service = new Drive.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) .setApplicationName("Drive samples") .build(); // File's metadata. File fileMetadata = new File(); fileMetadata.setName("photo.jpg"); fileMetadata.setParents(Collections.singletonList(realFolderId)); java.io.File filePath = new java.io.File("files/photo.jpg"); FileContent mediaContent = new FileContent("image/jpeg", filePath); try { File file = service.files().create(fileMetadata, mediaContent) .setFields("id, parents") .execute(); System.out.println("File ID: " + file.getId()); return file; } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to upload file: " + e.getDetails()); throw e; } } }
Python
import google.auth from googleapiclient.discovery import build from googleapiclient.errors import HttpError from googleapiclient.http import MediaFileUpload def upload_to_folder(folder_id): """Upload a file to the specified folder and prints file ID, folder ID Args: Id of the folder Returns: ID of the file uploaded Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for the application. """ creds, _ = google.auth.default() try: # create drive api client service = build("drive", "v3", credentials=creds) file_metadata = {"name": "photo.jpg", "parents": [folder_id]} media = MediaFileUpload( "download.jpeg", mimetype="image/jpeg", resumable=True ) # pylint: disable=maybe-no-member file = ( service.files() .create(body=file_metadata, media_body=media, fields="id") .execute() ) print(f'File ID: "{file.get("id")}".') return file.get("id") except HttpError as error: print(f"An error occurred: {error}") return None if __name__ == "__main__": upload_to_folder(folder_id="1s0oKEZZXjImNngxHGnY0xed6Mw-tvspu")
Node.js
/** * Upload a file to the specified folder * @param{string} folderId folder ID * @return{obj} file Id * */ async function uploadToFolder(folderId) { const fs = require('fs'); const {GoogleAuth} = require('google-auth-library'); const {google} = require('googleapis'); // Get credentials and build service // TODO (developer) - Use appropriate auth mechanism for your app const auth = new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/drive', }); const service = google.drive({version: 'v3', auth}); // TODO(developer): set folder Id // folderId = '1lWo8HghUBd-3mN4s98ArNFMdqmhqCXH7'; const fileMetadata = { name: 'photo.jpg', parents: [folderId], }; const media = { mimeType: 'image/jpeg', body: fs.createReadStream('files/photo.jpg'), }; try { const file = await service.files.create({ requestBody: fileMetadata, media: media, fields: 'id', }); console.log('File Id:', file.data.id); return file.data.id; } catch (err) { // TODO(developer) - Handle error throw err; } }
PHP
use Google\Client; use Google\Service\Drive; function uploadToFolder($folderId) { try { $client = new Client(); $client->useApplicationDefaultCredentials(); $client->addScope(Drive::DRIVE); $driveService = new Drive($client); $fileMetadata = new Drive\DriveFile(array( 'name' => 'photo.jpg', 'parents' => array($folderId) )); $content = file_get_contents('../files/photo.jpg'); $file = $driveService->files->create($fileMetadata, array( 'data' => $content, 'mimeType' => 'image/jpeg', 'uploadType' => 'multipart', 'fields' => 'id')); printf("File ID: %s\n", $file->id); return $file->id; } catch (Exception $e) { echo "Error Message: " . $e; } } require_once 'vendor/autoload.php'; uploadToFolder();
.NET
using Google.Apis.Auth.OAuth2; using Google.Apis.Drive.v3; using Google.Apis.Services; namespace DriveV3Snippets { // Class to demonstrate use of Drive upload to folder. public class UploadToFolder { /// <summary> /// Upload a file to the specified folder. /// </summary> /// <param name="filePath">Image path to upload.</param> /// <param name="folderId">Id of the folder.</param> /// <returns>Inserted file metadata if successful, null otherwise</returns> public static Google.Apis.Drive.v3.Data.File DriveUploadToFolder (string filePath, string folderId) { try { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredential credential = GoogleCredential.GetApplicationDefault() .CreateScoped(DriveService.Scope.Drive); // Create Drive API service. var service = new DriveService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "Drive API Snippets" }); // Upload file photo.jpg in specified folder on drive. var fileMetadata = new Google.Apis.Drive.v3.Data.File() { Name = "photo.jpg", Parents = new List<string> { folderId } }; FilesResource.CreateMediaUpload request; // Create a new file on drive. using (var stream = new FileStream(filePath, FileMode.Open)) { // Create a new file, with metadata and stream. request = service.Files.Create( fileMetadata, stream, "image/jpeg"); request.Fields = "id"; request.Upload(); } var file = request.ResponseBody; // Prints the uploaded file id. Console.WriteLine("File ID: " + file.Id); return file; } catch (Exception e) { // TODO(developer) - handle error appropriately if (e is AggregateException) { Console.WriteLine("Credential Not found"); } else if (e is FileNotFoundException) { Console.WriteLine("File not found"); } else if (e is DirectoryNotFoundException) { Console.WriteLine("Directory Not found"); } else { throw; } } return null; } } }
在資料夾間移動檔案
如要移動檔案,您必須更新 parents
屬性的 ID。
如要為現有檔案新增或移除父項,請使用 files.update
方法搭配 addParents
和
removeParents
查詢參數。
一個檔案只能有一個上層資料夾;無法指定多個父項 。
以下程式碼範例顯示如何使用 用戶端程式庫:
Java
import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; import java.util.Arrays; import java.util.List; /* Class to demonstrate use case for moving file to folder.*/ public class MoveFileToFolder { /** * @param fileId Id of file to be moved. * @param folderId Id of folder where the fill will be moved. * @return list of parent ids for the file. */ public static List<String> moveFileToFolder(String fileId, String folderId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); // Build a new authorized API client service. Drive service = new Drive.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) .setApplicationName("Drive samples") .build(); // Retrieve the existing parents to remove File file = service.files().get(fileId) .setFields("parents") .execute(); StringBuilder previousParents = new StringBuilder(); for (String parent : file.getParents()) { previousParents.append(parent); previousParents.append(','); } try { // Move the file to the new folder file = service.files().update(fileId, null) .setAddParents(folderId) .setRemoveParents(previousParents.toString()) .setFields("id, parents") .execute(); return file.getParents(); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to move file: " + e.getDetails()); throw e; } } }
Python
import google.auth from googleapiclient.discovery import build from googleapiclient.errors import HttpError def move_file_to_folder(file_id, folder_id): """Move specified file to the specified folder. Args: file_id: Id of the file to move. folder_id: Id of the folder Print: An object containing the new parent folder and other meta data Returns : Parent Ids for the file Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for the application. """ creds, _ = google.auth.default() try: # call drive api client service = build("drive", "v3", credentials=creds) # pylint: disable=maybe-no-member # Retrieve the existing parents to remove file = service.files().get(fileId=file_id, fields="parents").execute() previous_parents = ",".join(file.get("parents")) # Move the file to the new folder file = ( service.files() .update( fileId=file_id, addParents=folder_id, removeParents=previous_parents, fields="id, parents", ) .execute() ) return file.get("parents") except HttpError as error: print(f"An error occurred: {error}") return None if __name__ == "__main__": move_file_to_folder( file_id="1KuPmvGq8yoYgbfW74OENMCB5H0n_2Jm9", folder_id="1jvTFoyBhUspwDncOTB25kb9k0Fl0EqeN", )
Node.js
/** * Change the file's modification timestamp. * @param{string} fileId Id of the file to move * @param{string} folderId Id of the folder to move * @return{obj} file status * */ async function moveFileToFolder(fileId, folderId) { const {GoogleAuth} = require('google-auth-library'); const {google} = require('googleapis'); // Get credentials and build service // TODO (developer) - Use appropriate auth mechanism for your app const auth = new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/drive', }); const service = google.drive({version: 'v3', auth}); try { // Retrieve the existing parents to remove const file = await service.files.get({ fileId: fileId, fields: 'parents', }); // Move the file to the new folder const previousParents = file.data.parents .join(','); const files = await service.files.update({ fileId: fileId, addParents: folderId, removeParents: previousParents, fields: 'id, parents', }); console.log(files.status); return files.status; } catch (err) { // TODO(developer) - Handle error throw err; } }
PHP
use Google\Client; use Google\Service\Drive; use Google\Service\Drive\DriveFile; function moveFileToFolder($fileId,$folderId) { try { $client = new Client(); $client->useApplicationDefaultCredentials(); $client->addScope(Drive::DRIVE); $driveService = new Drive($client); $emptyFileMetadata = new DriveFile(); // Retrieve the existing parents to remove $file = $driveService->files->get($fileId, array('fields' => 'parents')); $previousParents = join(',', $file->parents); // Move the file to the new folder $file = $driveService->files->update($fileId, $emptyFileMetadata, array( 'addParents' => $folderId, 'removeParents' => $previousParents, 'fields' => 'id, parents')); return $file->parents; } catch(Exception $e) { echo "Error Message: ".$e; } }
.NET
using Google; using Google.Apis.Auth.OAuth2; using Google.Apis.Drive.v3; using Google.Apis.Services; namespace DriveV3Snippets { // Class to demonstrate use-case of Drive move file to folder. public class MoveFileToFolder { /// <summary> /// Move specified file to the specified folder. /// </summary> /// <param name="fileId">Id of file to be moved.</param> /// <param name="folderId">Id of folder where the fill will be moved.</param> /// <returns>list of parent ids for the file, null otherwise.</returns> public static IList<string> DriveMoveFileToFolder(string fileId, string folderId) { try { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredential credential = GoogleCredential.GetApplicationDefault() .CreateScoped(DriveService.Scope.Drive); // Create Drive API service. var service = new DriveService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "Drive API Snippets" }); // Retrieve the existing parents to remove var getRequest = service.Files.Get(fileId); getRequest.Fields = "parents"; var file = getRequest.Execute(); var previousParents = String.Join(",", file.Parents); // Move the file to the new folder var updateRequest = service.Files.Update(new Google.Apis.Drive.v3.Data.File(), fileId); updateRequest.Fields = "id, parents"; updateRequest.AddParents = folderId; updateRequest.RemoveParents = previousParents; file = updateRequest.Execute(); return file.Parents; } catch (Exception e) { // TODO(developer) - handle error appropriately if (e is AggregateException) { Console.WriteLine("Credential Not found"); } else if (e is GoogleApiException) { Console.WriteLine("File or Folder not found"); } else { throw; } } return null; } } }
檔案和資料夾限制
Google 雲端硬碟檔案和資料夾有一定的儲存空間限制。
使用者項目限制
每位使用者最多可擁有 5 億個由該帳戶建立的項目。 一旦達到上限,使用者就無法再於下列位置建立或上傳項目: 開車、他們仍可查看及編輯現有項目。如要建立 檔案,使用者必須永久刪除項目或使用其他帳戶。適用對象 詳情請參閱垃圾桶或刪除檔案,以及 資料夾。
計入這項上限的物件如下:
- 使用者在雲端硬碟中建立或上傳的項目
- 使用者建立但現在屬於他人擁有的項目
- 垃圾桶中的項目
- 捷徑
- 第三方捷徑
不計入這個上限的物件如下:
- 已永久刪除的項目
- 已與使用者共用,但為他人擁有的項目
- 使用者擁有,但由他人建立的項目
嘗試新增超過 5 億個項目時,
activeItemCreationLimitExceeded
敬上
HTTP 狀態碼回應。
請注意,雖然服務帳戶可容納的項目數量沒有上限 項目數量限制為 5 億個項目,單一服務帳戶的項目數量 物件
資料夾項目限制
使用者「我的雲端硬碟」中的每個資料夾最多只能包含 500,000 個項目。 這項限制不適用於「我的雲端硬碟」根資料夾。項目數 計入上限的下列項目如下:
- 資料夾
- 檔案。所有檔案類型 (無論檔案擁有權為何)。
- 快速鍵。即使該項目包含單一項目,也仍會計為資料夾中的單一項目 則不在該資料夾中。詳情請參閱建立 雲端硬碟檔案的捷徑。
- 第三方快速鍵。仍會視為資料夾中的單一項目,即使 但系統指定的項目不在該資料夾中若需更多資訊,請參閲 為您儲存的內容建立捷徑檔案 app。
如要進一步瞭解資料夾限制,請參閱 Google 雲端硬碟。
資料夾深度限制
使用者的「我的雲端硬碟」最多只能有 100 層巢狀結構
資料夾。也就是說,您無法將子資料夾儲存在
有超過 99 個關卡這項限制僅適用於子資料夾。孩子
MIME 類型檔案
application/vnd.google-apps.folder
不受這項限制約束。
舉例來說,在下圖中,新資料夾可在資料夾中以巢狀結構嵌入 數字 99,但不在資料夾編號 100 內。不過,資料夾編號 100 可以儲存 檔案:
如果您嘗試新增超過 100 個資料夾層級,系統會傳回
myDriveHierarchyDepthLimitExceeded
敬上
HTTP 狀態碼回應。