で、まずはGoogle Driveにファイルをアップロードする(Google先生曰くこれがHello, World!らしい)ところから始めます。Google Drive SDK — Google DevelopersのQuickstart: Run a Drive App in Javaを見てやってみましょう。という話。
フォルダはどうやって表されているの?
とりあえずQuickstartは動いたので、次にフォルダを作ってみます。Google Driveでフォルダはどうやって表されてるの?ということで、貴重な日本語公式資料のファイルとフォルダを操作する - Google デベロッパー アカデミー — Google Developersによると、『フォルダとは、MIME タイプが application/vnd.google-apps.folder で、拡張子を持たないファイルです。』らしいです。えっ………ファイル………………?
とりあえずフォルダを作ってみる
※以下Quickstartのコードのファイルアップロードするところだけをちょこまかといじってます。認証部とかはそのままにしてます。見なかったことにしてネットの海でコードを探します。c# - upload an Image to a created folder in Google drive account - Stack Overflowを見るところによれば、ファイルを作る場合、Quickstartにも似たようなコードが出てきたように、Fileクラスのインスタンスは
//ファイルのひな形を作る感じ
File body = new File();
body.Title = "My document";
body.Description = "A test document";
body.MimeType = "text/plain";
//ファイルの中身を書き込む…?
byte[] byteArray = System.IO.File.ReadAllBytes("document.txt");
System.IO.MemoryStream stream = new System.IO.MemoryStream(byteArray);
//アップロードする
FilesResource.InsertMediaUpload request =
service.Files.Insert(body, stream, "text/plain");
request.Upload();
//アップロードされたファイルのIdを取得しておく
File file = request.ResponseBody;
Console.WriteLine("File id: " + file.Id);
のように設定してアップロードします。ですが、フォルダを作成する場合には、
//フォルダを作る
File folder = new File();
folder.Title = "myfolder2";
folder.Description = "my folder description";
//フォルダなのでMimeTypeはこれ
folder.MimeType = "application/vnd.google-apps.folder";
//アップロード
File file = service.Files.Insert(folder).Fetch();
Console.WriteLine("folder id : " + file.Id);
という風にすると、フォルダが作成できるみたいです。ちゃんとMime Typeがapplication/vnd.google-apps.folderになってますね。
アップロードの手順も違っていますが、何か意味があるんでしょうか…(動いたからとりあえず違いに目を瞑っている)
![]() |
| 動きました |
親フォルダを指定してファイルをアップロードする
はてさて。親フォルダを指定する場合はどうすればいいんでしょう?上に紹介したリンク先のコードにある通り、
string parentId = "";//親フォルダのId
File file = new File();
//...
file.Parents = new List<parentreference>()
{ new ParentReference() {Id = parentId} };
とします。ですが親フォルダのIdが分からないので、フォルダを検索してIdを取得してこないといけません。検索はどうやってするんだ…?
Search for Files Google Drive SDK — Google Developersより、Files.listを使えばいいらしいので、Files: list - Google Drive SDK — Google Developersのサンプルコードを実行してみます。
ここでは、フォルダだけを表示するために、Query = "mimeType = 'application/vnd.google-apps.folder'"としています。クエリの詳細は上のSearch for Filesを見てください。便利ですねこれ。
//フォルダのみを選ぶクエリ
string query = "mimeType = 'application/vnd.google-apps.folder'";
List<file> result = new List<file>();
FilesResource.ListRequest req = service.Files.List();
req.Q = query; //クエリを使わない(全ファイル、フォルダを表示)時は削除
do
{
try
{
FileList files = req.Fetch();
result.AddRange(files.Items);
req.PageToken = files.NextPageToken;
}
catch (Exception e)
{
Console.WriteLine("An error occurred:" + e.Message);
req.PageToken = null;
}
} while (!String.IsNullOrEmpty(req.PageToken));
//検索結果を見てみよう
foreach (File f in result)
{
Console.WriteLine("File name :" + f.Title + " id :" + f.Id);
}
すると、コンソールにフォルダ名とIdが出てきたと思います。これで準備は整いましたね。さっき作ったmyfolder2にdocument.txtをアップロードする場合は、
//まずフォルダ名がmyfolder2なものを検索
string query = "title = 'myfolder2'";
List<File> result = new List<File>();
FilesResource.ListRequest req = service.Files.List();
req.Q = query;
do
{
try
{
FileList files = req.Fetch();
result.AddRange(files.Items);
req.PageToken = files.NextPageToken;
}
catch (Exception e)
{
Console.WriteLine("An error occurred:" + e.Message);
req.PageToken = null;
}
} while (!String.IsNullOrEmpty(req.PageToken));
//親フォルダのIdをコピっとく
string parentId = "";
foreach (File f in result)
{
parentId = f.Id;
}
//ファイルをアップロードします
File body = new File();
body.Title = "My document";
body.Description = "A test document";
body.MimeType = "text/plain";
body.Parents = new List<ParentReference>(){
new ParentReference() { Id = parentId }
};
byte[] byteArray = System.IO.File.ReadAllBytes("document.txt");
System.IO.MemoryStream stream = new System.IO.MemoryStream(byteArray);
FilesResource.InsertMediaUpload request =
service.Files.Insert(body, stream, "text/plain");
request.Upload();
File file = request.ResponseBody;
Console.WriteLine("File id: " + file.Id);
Console.WriteLine("Press Enter to end this process.");
Console.ReadLine();
とすればいいみたいです(エラー処理はしてないので各自で)。めでたしめでたし。3日前くらいにつまったのですが、なんとか解決したので良かったです。しかし、いちいちAuthorization Codeをコピペするのは面倒なんですが…ココらへんを参考にして、どうにかしたいですね。
後、記事が無駄に長くなっちゃって、もう少し見栄え良く読みやすい記事を書けないものかと思います…
おまけ
SyntaxHighlighterで<や>を使う場合には、HTML Escapeしないといけないんですね。<なら<に。>なら>に。です。
まあBloggerの場合は、コードをHTML編集で貼り付けると、InvalidなHTMLは認めないらしくてList<File>と書くと勝手に</File>してくれます。凄い…凄いけどいらない…
