#google-drive #drive #google #client #rest-client #google-service #gdrive

nightly google_drive_client

Google Drive 客户端 (Rocket) for api rest

10 个版本

0.4.6 2021年6月4日
0.4.5 2021年1月14日
0.4.4 2020年11月2日
0.4.3 2020年10月23日
0.1.0 2019年9月20日

#598 in 文件系统

每月 35 次下载

自定义许可

110KB
1.5K SLoC

Google Drive 客户端 (Rocket)

Google Drive Client Version

这个库提供了一种使用服务帐户连接到 Google Drive API (v3) 的方法。您可以执行基本操作,如上传、列出或下载文件。此代码旨在与Rocket服务器一起使用,因为我们可以使用服务帐户提供对驱动器的访问,而不需要用户交互。对于其他用途,您可以使用其他库,如gooogle-drive3等。

依赖项

在您的项目中,您需要导入这些依赖项

# Rocket Webserver
[dependencies.google_drive_client]
version = "0.4.6"

如何使用它

您有一个提供者,您可以直接使用,例如以下示例

use google_drive_client::{GoogleDriveClient, DriveFileList, DriveFileSearchBuilder};

let gdrive_client: GoogleDriveClient = GoogleDriveClient::default();
let result = gdrive_client.find(DriveFileSearchBuilder::build()
        .with_order_by("name")
        .done());
let file_list:DriveFileList = result.unwrap();

在这个示例中,您可以看到我们如何获取按名称排序的驱动器上的文件列表。

另一个示例是使用 rocket,您可以使用 rocket管理客户端

let gdrive_client: GoogleDriveClient = GoogleDriveClient::default();
rocket.manage(gdrive_client);

然后您可以在控制器中使用它,例如

#[get("/storage/download_file/<file_id>")]
fn download_file(gdrive: State<GoogleDriveClient>, file_id: String) -> FileDownloadResponse {
    let storage = gdrive.inner().clone();
    storage.download_file(&file_id).unwrap()
}

在上一个示例中,我们使用了FileDownloadResponse,该类型实现了来自 rocket 的Responder,因此您可以直接使用它将文件内容直接放入响应中,这是一种解决文件响应的干净方式。

设置服务帐户

要使用此库,您需要一个 Google 服务帐户,当您拥有该服务帐户时,您将获得一个 json 格式的服务帐户,其中包含与 gdrive 进行身份验证的所有私有信息。此库会扫描一些位置以获取该文件,首先它会检查一个名为 GDRIVE_ACCOUNT_FILE_NAME 的环境变量,如果该变量存在,它应包含 json 文件的完整路径位置,如果该变量不存在,库将继续在主目录中进行扫描,应存在一个名为 service_account.json 的服务帐户 json 文件。如果这些选项都不可用,库将抛出错误。

设置共享帐户

由于服务账户不能直接拥有文件,因为它们不是真实账户,我们需要将此账户创建的文件共享给真实账户,才能在真实账户的驱动器中查看文件。为此,我们将文件与真实账户共享,为此,我们使用一个环境变量来设置该账户,该变量称为 GDRIVE_SHARE_ACCOUNT,所有创建的文件和文件夹都将与此账户共享。如果没有设置此变量,则将创建文件但不会共享,因此您将在gdrive账户中看不到它们,但文件将存在。

多块上传支持

现在您可以使用Google提供的多块上传逻辑上传文件。基本上,您需要在客户端的配置中提供一个块大小。您可以这样操作

use google_drive_client::{GoogleDriveClient, DriveFileList, DriveFileSearchBuilder, GoogleDriveClientParams};

let gdrive_client: GoogleDriveClient = GoogleDriveClient::new(GoogleDriveClientParams {
                                          request_timeout: Duration::from_secs(30),
                                          chunk_size: Some(ChunkSize::new(10, ChunkSizeUnitType::MB)),
                                          proxy: None
                                      });

在示例中,您有一个10MB的块大小,因此如果您有一个20MB的文件,则该文件将以两个10MB的块上传。

代理支持

您可以通过指定参数中的代理在客户端配置代理,如下所示

use google_drive_client::{GoogleDriveClient, DriveFileList, DriveFileSearchBuilder, GoogleDriveClientParams};

let gdrive_client: GoogleDriveClient = GoogleDriveClient::new(GoogleDriveClientParams {
                                          request_timeout: Duration::from_secs(30),
                                          chunk_size: Some(ChunkSize::new(10, ChunkSizeUnitType::MB)),
                                          proxy: Some("https://127.0.0.1:8888".to_string())
                                      });

依赖项

~18–32MB
~520K SLoC