C# Google Drive APIv3 Upload File

后端 未结 4 1637
攒了一身酷
攒了一身酷 2021-01-12 19:57

I\'m making a simple Application that Links to a Google Drive Account and then can Upload Files to any Directory and respond with a (direct) download Link. I already got my

4条回答
  •  终归单人心
    2021-01-12 20:35

    Once you have enabled your Drive API, registered your project and obtained your credentials from the Developer Consol, you can use the following code for recieving the user's consent and obtaining an authenticated Drive Service

    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.
    

    Following is a working piece of code for uploading to Drive.

        // _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() { 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");
       }
    }
    

    Here's the little function for determining the MimeType:

    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;
    }
    

    Additionally, you can register for the ProgressChanged event and get the upload status.

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

    And

     private void UploadProgessEvent(Google.Apis.Upload.IUploadProgress obj)
     {
         label1.Text = ((obj.ByteSent*100)/TotalSize).ToString() + "%";
    
        // do updation stuff
     }
    

    That's pretty much it on Uploading..

    Source.

提交回复
热议问题