C#のプログラムでGoogle Driveのファイルをダウンロードするコードを紹介します。
Google Drive APIを有効化します。手順はこちらの記事を参照してください。
Google APIのサービスアカウントを作成します。アカウントの作成手順はこちらの記事
を参照してください。
Google API サービスアカウントの認証キーを作成します。
作成の具体的な手順はこちらの記事を参照してください。
今回はJSON形式のキーファイルを作成しています。
Google Drive にログインし共有フォルダを作成し、先の手順で作成したサービスアカウントと共有します。
具体的な操作手順はこちらの記事を参照して下さい。
C#のプロジェクトを作成します。今回はWindows Formアプリケーションを作成します。
作成したプロジェクトに Google.Apis.Drive.V3 パッケージをインストールします。
インストールの手順はこちらの記事を参照してください。
下図のフォームを作成します。テキストボックスを2つ、ボタンを1つ配置します。
下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Google.Apis.Drive.v3;
using System.IO;
namespace GoogleDriveDownload
{
public partial class FormSimpleFileDownload : Form
{
public FormSimpleFileDownload()
{
InitializeComponent();
}
static string[] Scopes = { DriveService.Scope.Drive };
private void button1_Click(object sender, EventArgs e)
{
FileStream fs = new FileStream("(JSONキーファイルのパス)", FileMode.Open, FileAccess.Read);
Google.Apis.Auth.OAuth2.GoogleCredential credential = Google.Apis.Auth.OAuth2.GoogleCredential.FromStream(fs).CreateScoped(Scopes);
Google.Apis.Services.BaseClientService.Initializer init = new Google.Apis.Services.BaseClientService.Initializer();
init.HttpClientInitializer = credential;
init.ApplicationName = "My Test App";
DriveService service = new DriveService(init);
//FileInfo
Google.Apis.Drive.v3.Data.File file = service.Files.Get(textBox1.Text).Execute();
textBox2.Text += string.Format("ID:{0} のファイル情報を取得しました。 MimeType:{1}\r\n", file.Name, file.MimeType);
//Dowbnload
FilesResource.GetRequest req = service.Files.Get(textBox1.Text);
FileStream dfs = new FileStream("c:\\data\\"+ file.Name, FileMode.Create, FileAccess.Write);
req.Download(dfs);
dfs.Close();
textBox2.Text += "ファイルのダウンロードが完了しました。\r\n";
}
}
}
Google Drive オブジェクトの作成や認証についての詳細はこちらの記事を参照してください。
FileStream fs = new FileStream("(JSONキーファイルのパス)", FileMode.Open, FileAccess.Read);
Google.Apis.Auth.OAuth2.GoogleCredential credential = Google.Apis.Auth.OAuth2.GoogleCredential.FromStream(fs).CreateScoped(Scopes);
Google.Apis.Services.BaseClientService.Initializer init = new Google.Apis.Services.BaseClientService.Initializer();
init.HttpClientInitializer = credential;
init.ApplicationName = "My Test App";
DriveService service = new DriveService(init);
入力されたIDのファイル名を取得します。IDからファイル情報を取得する場合は、DriveService オブジェクトの File.Get()
メソッドを利用します。
メソッドの第一引数に取得したい要素のIDを与えます。ファイルの情報は Getメソッドの戻り値の Google.Apis.Drive.v3.Data.File
オブジェクトで
取得できます。
Google.Apis.Drive.v3.Data.File file = service.Files.Get(textBox1.Text).Execute();
textBox2.Text += string.Format("ID:{0} のファイル情報を取得しました。 MimeType:{1}\r\n", file.Name, file.MimeType);
FilesResource.GetRequest
オブジェクトを作成します。
作成したオブジェクトの Download()
メソッドを呼び出します。Downloadメソッドの第一引数にダウンロードしたファイルを保存する
FileStreamを与えます。FileStreamのコンストラクタのファイル保存パスはc:\data
ディレクトリを指定します。ファイル名はダウンロードするファイルの
Google Driveでのファイル名とします。また、ファイルのダウンロード後にはFileStreamをCloseします。
FilesResource.GetRequest req = service.Files.Get(textBox1.Text);
FileStream dfs = new FileStream("c:\\data\\"+ file.Name, FileMode.Create, FileAccess.Write);
req.Download(dfs);
dfs.Close();
上記のプロジェクトを実行します。下図のウィンドウが表示されます。
上部のテキストボックスにダウンロードするファイルのIDを入力します。入力後、[button1]をクリックします。
入力したIDのファイル情報を取得し、ファイルのダウンロードが実行されます。
c:\data
ディレクトリを確認します。ファイルがダウンロードされていることが確認できます。Downloadメソッドは同期処理のため、ファイルをダウンロード中は制御が戻らないためUIがフリーズした状態になります。
ダウンロードするファイルサイズが大きい場合、時間がかかる場合はUIがフリーズしないようにするために、
非同期アップロード処理である、UploadAsync()
メソッドを利用します。
private async void button2_Click(object sender, EventArgs e)
{
FileStream fs = new FileStream("(JSONキーファイルのパス)", FileMode.Open, FileAccess.Read);
Google.Apis.Auth.OAuth2.GoogleCredential credential = Google.Apis.Auth.OAuth2.GoogleCredential.FromStream(fs).CreateScoped(Scopes);
Google.Apis.Services.BaseClientService.Initializer init = new Google.Apis.Services.BaseClientService.Initializer();
init.HttpClientInitializer = credential;
init.ApplicationName = "My Test App";
DriveService service = new DriveService(init);
Google.Apis.Drive.v3.Data.File file = service.Files.Get(textBox1.Text).Execute();
textBox2.Text += string.Format("ID:{0} のファイル情報を取得しました。 MimeType:{1}\r\n", file.Name, file.MimeType);
FilesResource.GetRequest req = service.Files.Get(textBox1.Text);
FileStream dfs = new FileStream("c:\\data\\" + file.Name, FileMode.Create, FileAccess.Write);
await req.DownloadAsync(dfs);
dfs.Close();
textBox2.Text += "ファイルのダウンロードが完了しました。\r\n";
}