/// <summary>
        /// Create a new file and return it.
        /// </summary>
        public static Google.Apis.Drive.v2.Data.File InsertResource(Google.Apis.Drive.v2.DriveService service, IAuthenticator auth, String title,
                                                                    String description, String mimeType, String content)
        {
            // File's metadata.
            Google.Apis.Drive.v2.Data.File body = new Google.Apis.Drive.v2.Data.File();
            body.Title       = title;
            body.Description = description;
            body.MimeType    = mimeType;

            byte[]       byteArray = Encoding.UTF8.GetBytes(content);
            MemoryStream stream    = new MemoryStream(byteArray);

            Google.Apis.Drive.v2.FilesResource.InsertMediaUpload request = service.Files.Insert(body, stream, mimeType);
            request.Upload();

            var file = request.ResponseBody;

            Permission newPermission = new Permission();

            newPermission.Type     = "anyone";
            newPermission.Role     = "reader";
            newPermission.Value    = "";
            newPermission.WithLink = true;
            service.Permissions.Insert(newPermission, file.Id).Fetch();

            return(file);
        }
        /// <summary>
        /// Create a new file and return it.
        /// </summary>
        public static Google.Apis.Drive.v2.Data.File InsertResource(Google.Apis.Drive.v2.DriveService service, IAuthenticator auth, String title,
                                                                    String description, String mimeType, String content)
        {
            // File's metadata.
            Google.Apis.Drive.v2.Data.File body = new Google.Apis.Drive.v2.Data.File();
            body.Title       = title;
            body.Description = description;
            body.MimeType    = mimeType;

            byte[]       byteArray = Encoding.ASCII.GetBytes(content);
            MemoryStream stream    = new MemoryStream(byteArray);

            Google.Apis.Drive.v2.FilesResource.InsertMediaUpload request = service.Files.Insert(body, stream, mimeType);
            request.Upload();

            return(request.ResponseBody);
        }
        public async Task <ActionResult> UploadGoogleFileAsync(HttpPostedFileBase file, FileModel document, CancellationToken cancellationToken)
        {
            var result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()).
                         AuthorizeAsync(cancellationToken);

            if (result.Credential != null)
            {
                var service = new GFile.DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = result.Credential,
                    ApplicationName       = "WorkCard.vn"
                });

                if (file != null)
                {
                    if (file.ContentLength > 0)
                    {
                        var fileName = System.IO.Path.GetFileName(file.FileName);
                        var path     = System.IO.Path.Combine(Server.MapPath("~/App_Data/Uploads/GoogleDrives"), fileName);
                        file.SaveAs(path);

                        GDataFile.File _file = new GDataFile.File();
                        _file.Title       = file.FileName;
                        _file.Description = "From WorkCard.vn; ";
                        _file.MimeType    = GetMimeType(file.FileName);
                        _file.CanComment  = true;
                        _file.Shared      = true;
                        _file.Shareable   = true;

                        using (var stream = new System.IO.FileStream(path, System.IO.FileMode.Open))
                        {
                            try
                            {
                                GFile.FilesResource.InsertMediaUpload request = service.Files.Insert(_file, stream, _file.MimeType);
                                await request.UploadAsync();

                                if (request.ResponseBody != null)
                                {
                                    Permission permission = new Permission
                                    {
                                        Type     = "anyone",
                                        Role     = "writer",
                                        WithLink = true
                                    };

                                    var a = service.Permissions.Insert(permission, request.ResponseBody.Id);
                                    await a.ExecuteAsync();

                                    using (ApplicationDbContext context = new ApplicationDbContext())
                                    {
                                        document.Id = Guid.NewGuid();
                                        document.Load(request.ResponseBody);
                                        document.CreatedBy   = User.Identity.Name;
                                        document.CreatedDate = DateTime.Now;

                                        context.Files.Add(document);
                                        await context.SaveChangesAsync();
                                    }
                                }
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine("An error occurred: " + e.Message);
                            }
                        }
                    }
                    if (Request.IsAjaxRequest())
                    {
                        return(PartialView());
                    }
                }

                return(RedirectToAction("Details", "Articles", new { id = document.ArticleId }));
            }
            else
            {
                return(new RedirectResult(result.RedirectUri));
            }
        }