で、まずは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>してくれます。凄い…凄いけどいらない…