2016-10-14 13 views
3

Googleドライブアカウントにリンクしてファイルを任意のディレクトリにアップロードし、(直接の)ダウンロードリンクで対応できる簡単なアプリケーションを作成しています。 私は既にUser CredentialsとDriveServiceオブジェクトを持っていますが、良い例やドキュメントは見つけられません。 APIv3上でC#GoogleドライブAPIv3アップロードファイル

私はOAuthをよく知らないので、今すぐbyte[]コンテンツを含むファイルをアップロードする方法について、きれいで明確な説明を求めています。 Googleドライブアカウントにアプリケーションをリンクするための

私のコードは:(これは完全に動作するかどうかわからない)

UserCredential credential; 


     string dir = Directory.GetCurrentDirectory(); 
     string path = Path.Combine(dir, "credentials.json"); 

     File.WriteAllBytes(path, Properties.Resources.GDJSON); 

     using(var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { 
      string credPath = Path.Combine(dir, "privatecredentials.json"); 

      credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
       GoogleClientSecrets.Load(stream).Secrets, 
       Scopes, 
       "user", 
       CancellationToken.None, 
       new FileDataStore(credPath, true)).Result; 
     } 

     // Create Drive API service. 
     _service = new DriveService(new BaseClientService.Initializer() { 
      HttpClientInitializer = credential, 
      ApplicationName = ApplicationName, 
     }); 

     File.Delete(path); 

マイコードは、これまでのアップロードのための:(明らかに動作しません)

 public void Upload(string name, byte[] content) { 

     Google.Apis.Drive.v3.Data.File body = new Google.Apis.Drive.v3.Data.File(); 
     body.Name = name; 
     body.Description = "My description"; 
     body.MimeType = GetMimeType(name); 
     body.Parents = new List() { new ParentReference() { Id = _parent } }; 


     System.IO.MemoryStream stream = new System.IO.MemoryStream(content); 
     try { 
      FilesResource.InsertMediaUpload request = _service.Files.Insert(body, stream, GetMimeType(_uploadFile)); 
      request.Upload(); 
      return request.ResponseBody; 
     } catch(Exception) { } 
    } 

ありがとうございます!

答えて

3

プロジェクトを登録し、あなたのドライブのAPIを有効にしてDeveloper Consolから資格情報を取得したら、あなたは利用者の同意が供給し、取得するための次のコードを使用することができ、認証ドライブサービス

string[] scopes = new string[] { DriveService.Scope.Drive, 
          DriveService.Scope.DriveFile}; 
var clientId = "xxxxxx";  // From https://console.developers.google.com 
var clientSecret = "xxxxxxx";   // From https://console.developers.google.com 
// here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData% 
var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = clientId, 
                       ClientSecret = clientSecret}, 
                 scopes, 
                 Environment.UserName, 
                 CancellationToken.None, 
                 new FileDataStore("MyAppsToken")).Result; 
//Once consent is recieved, your token will be stored locally on the AppData directory, so that next time you wont be prompted for consent. 

DriveService service = new DriveService(new BaseClientService.Initializer() 
{ 
    HttpClientInitializer = credential, 
    ApplicationName = "MyAppName", 
}); 
service.HttpClient.Timeout = TimeSpan.FromMinutes(100); 
//Long Operations like file uploads might timeout. 100 is just precautionary value, can be set to any reasonable value depending on what you use your service for. 

後、Aでありますドライブにアップロードするためのコードです

private static string GetMimeType(string fileName) 
{ 
    string mimeType = "application/unknown"; 
    string ext = System.IO.Path.GetExtension(fileName).ToLower(); 
    Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext); 
    if (regKey != null && regKey.GetValue("Content Type") != null) 
     mimeType = regKey.GetValue("Content Type").ToString(); 
    return mimeType; 
} 

また、あなたがProgressChangedイベントに登録して、アップロードのステータスを取得することができます。

// _service: Valid, authenticated Drive service 
    // _uploadFile: Full path to the file to upload 
    // _parent: ID of the parent directory to which the file should be uploaded 

public static Google.Apis.Drive.v2.Data.File uploadFile(DriveService _service, string _uploadFile, string _parent, string _descrp = "Uploaded with .NET!") 
{ 
    if (System.IO.File.Exists(_uploadFile)) 
    { 
     File body = new File(); 
     body.Title = System.IO.Path.GetFileName(_uploadFile); 
     body.Description = _descrp; 
     body.MimeType = GetMimeType(_uploadFile); 
     body.Parents = new List<ParentReference>() { new ParentReference() { Id = _parent } }; 

     byte[] byteArray = System.IO.File.ReadAllBytes(_uploadFile); 
     System.IO.MemoryStream stream = new System.IO.MemoryStream(byteArray); 
     try 
     { 
      FilesResource.InsertMediaUpload request = _service.Files.Insert(body, stream, GetMimeType(_uploadFile)); 
      request.Upload(); 
      return request.ResponseBody; 
     } 
     catch(Exception e) 
     { 
      MessageBox.Show(e.Message,"Error Occured"); 
     } 
    } 
    else 
    { 
     MessageBox.Show("The file does not exist.","404"); 
    } 
} 

ここでMIMEタイプを決定するための少しの機能があります。

request.ProgressChanged += UploadProgessEvent; 
request.ChunkSize = FilesResource.InsertMediaUpload.MinimumChunkSize; // Minimum ChunkSize allowed by Google is 256*1024 bytes. ie 256KB. 

そして

かなりそれをアップロードするのだ
private void UploadProgessEvent(Google.Apis.Upload.IUploadProgress obj) 
{ 
    label1.Text = ((obj.ByteSent*100)/TotalSize).ToString() + "%"; 

    // do updation stuff 
} 

..

Source

+0

こんにちは、Googleドライブv3のAPIにFileResourceのInsertMediaUploadが含まれていないため、コードはどのように機能しましたか?また、インサートはファイルで廃止予定です。https://developers.google.com/drive/v3/web/migration – SKLTFZ

+0

ああ!申し訳ありません..あなたは正しいです。上記のコードはAPI v2用です。私は編集を行います。 –

0

私はすでにnuget によってAPI v3のドライブ、GoogleともグーグルAPIからJSONファイルを作成し、プロジェクト request.ResponseBodyに挿入設置4.0 fwは鉱山アプリケーションのWinFormsのC#に同じ問題を抱えている== nullの?

誰でも解決策がありますか?事前

0

によって

おかげで私はあなたが少しだけわからない、正しい方向に向かっていると思います。

のC#(。NET)アプリケーションのためのGoogleドライブのAPIを使用する際の主な手順は

  1. は、GoogleドライブSDKをインストールしてGoogleアカウント

  2. でGoogleドライブのAPIを有効にしています。 NETフレームワーク "NuGet"パッケージマネージャを使用しています。このためには、Visual Studioで、[ツール] - > [NuGetパッケージマネージャ - >パッケージマネージャコンソールとし、次のコマンド

    Install-Package Google.Apis.Drive.v3 
    
  3. は、使用して、アプリケーション内のすべてのパッケージ/ライブラリ「を使う」ことを確認してください入力してください"using"ステートメントを先頭に追加します。たとえば、あなたが上記の書かれている

    using Google.Apis.Auth.OAuth2; 
    using Google.Apis.Drive.v3; 
    using Google.Apis.Drive.v3.Data; 
    using Google.Apis.Services; 
    using Google.Apis.Util.Store; 
    
  4. コードは(私はハードにそれをテストしていない)私には正しいようです。しかし、ファイルのアップロードに問題がある場合は、下記のリンクを使ってさまざまなアプローチを試みることができます。

上記の手順は、主にGoogle Drive API's .NET Quickstartページから行われます。

さらに、Google's documentation for the Google Drive SDK for .NET frameworkを参照してください。

上記のコンテンツがあなたに役立つことを願っています。

2

Google Drive API's .NET Quickstartガイドに従っていれば、最初の起動時にgoogleドライブのウェブページが「読み取り専用」の許可を得てGoogleドライブにアクセスするための許可を要求している可能性があります。

クイックスタートガイドのデフォルトの有効範囲 "DriveService.Scope.DriveReadonly"は、ファイルをアップロードする場合には使用できません。

これはAPI Manager

に新しいアプリケーション名の例: "ドライブAPI .NET Quickstart2" と資格証明書の別のセットを作成します Apps connected to your account

  • から私

    1. 削除 "ドライブのプロトタイプ" のために働いていました

    2. "DriveService.Scope.DriveFile" プライベート静的読み取り専用文字列[]スコープ= {DriveService.Scope.DriveReadonly}; プライベート静的読み取り専用文字列のApplicationName =「ドライブAPI .NET Quickstart2」;}

    3. あなたは

      ドライブのプロトタイプがしたい 新しい補助金

      を要求して、Googleのドライブから新しいページに着陸する必要があり

      :Googleドライブのファイルを表示し、管理しますあなたがこのアプリケーションで開いた、または作成したフォルダを表示します。

    アクセスを許可したら、アプリケーションはアップロードできるはずです。

  • 関連する問題