GoogleDriveUserItem.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. using Google.Apis.Auth.OAuth2;
  2. using Google.Apis.Download;
  3. using Google.Apis.Drive.v3;
  4. using Google.Apis.Services;
  5. using Google.Apis.Util.Store;
  6. using PDF_Office.Model.CloudDrive;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading;
  13. using System.Threading.Tasks;
  14. namespace PDF_Office.ViewModels.HomePanel.CloudDrive
  15. {
  16. //对单用户账号处理核心功能
  17. public class GoogleDriveUserItem
  18. {
  19. public GoogleDriveUser User { get; private set; }
  20. public static string[] Scopes = { DriveService.Scope.Drive };
  21. public DriveService Service { get; private set; }
  22. private List<GoogleDriveFiles> GoogleDriveFilesList = new List<GoogleDriveFiles>();
  23. public GoogleDriveUserItem()
  24. {
  25. User = new GoogleDriveUser();
  26. }
  27. #region 请求身份验证
  28. /// <summary>
  29. /// 获取登录过的账号
  30. /// </summary>
  31. /// <returns>历史账号</returns>
  32. public async Task<List<DriveService>> GetHistoryService()
  33. {
  34. DirectoryInfo TheFolder = new DirectoryInfo(GoogleDriveViewModel.FilesPathTemp);
  35. List<DriveService> DriveServices = new List<DriveService>();
  36. foreach (var directorieItem in TheFolder.GetDirectories())
  37. {
  38. var driveServiceItem = await GetServiceAsync(directorieItem.Name);
  39. if (driveServiceItem != null)
  40. {
  41. DriveServices.Add(driveServiceItem);
  42. }
  43. }
  44. return DriveServices;
  45. }
  46. /// <summary>
  47. /// 异步获取Google服务的包信息,避免UI线程卡死
  48. /// </summary>
  49. /// <param name="userInfoFile"></param>
  50. [Obsolete]
  51. public async Task<DriveService> GetServiceAsync(string userInfoFile = "")
  52. {
  53. DriveService service = null;
  54. await Task.Run(() =>
  55. {
  56. service = GetService(userInfoFile);
  57. });
  58. if (userInfoFile == "")
  59. {
  60. if (service != null)
  61. Service = service;
  62. }
  63. return service;
  64. }
  65. /// <summary>
  66. /// 获取Google服务的包信息(包含访问令牌,App Key密钥等)
  67. /// </summary>
  68. /// <param name="FilePath">登录过的用户文件;若为空,则为新用户登录</param>
  69. /// <returns></returns>
  70. [Obsolete]
  71. private DriveService GetService(string FilePath = "")
  72. {
  73. UserCredential credential;
  74. if (FilePath == "")
  75. {
  76. var time = DateTime.Now.ToString("yyyyMMddHHmmss");
  77. FilePath = System.IO.Path.Combine(GoogleDriveViewModel.FilesPathTemp, time + ".json");
  78. }
  79. using (var stream = new FileStream(GoogleDriveViewModel.CredentialsPath, FileMode.Open, FileAccess.Read))
  80. {
  81. credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
  82. GoogleClientSecrets.Load(stream).Secrets,
  83. Scopes,
  84. "user",
  85. CancellationToken.None,
  86. new FileDataStore(FilePath, true)).Result;
  87. User.CurrentCredential = credential;
  88. }
  89. //create Drive API service.
  90. DriveService service = new DriveService(new BaseClientService.Initializer()
  91. {
  92. HttpClientInitializer = credential,
  93. ApplicationName = "PDF Office",
  94. });
  95. return service;
  96. }
  97. #endregion
  98. #region 对用户账号处理
  99. public async Task<bool> RemoveUser()
  100. {
  101. bool result = false;
  102. if (User.CurrentCredential != null)
  103. {
  104. result = await User.CurrentCredential.RevokeTokenAsync(CancellationToken.None);
  105. }
  106. if (result == true)
  107. User.CurrentCredential = null;
  108. return result;
  109. }
  110. /// <summary>
  111. /// 获取帐号
  112. /// </summary>
  113. /// <returns>返回用户帐号地址</returns>
  114. public string GetUserAcount()
  115. {
  116. string userAcount = "";
  117. if (Service != null)
  118. {
  119. var about = Service.About.Get();
  120. about.Fields = "user";
  121. userAcount = about.Execute().User.EmailAddress;
  122. }
  123. return userAcount;
  124. }
  125. #endregion
  126. #region 文件夹
  127. #endregion
  128. #region 文件
  129. /// <summary>
  130. /// 对单个用户,获取文件列表
  131. /// </summary>
  132. public async Task<List<GoogleDriveFiles>> GetDriveFiles(DriveService service = null)
  133. {
  134. if (service == null)
  135. service = await GetServiceAsync();
  136. // define parameters of request.
  137. FilesResource.ListRequest FileListRequest = service.Files.List();
  138. //listRequest.PageSize = 10;
  139. //listRequest.PageToken = 10;
  140. FileListRequest.Fields = "nextPageToken, files(id, name, size, version, createdTime)";
  141. //get file list.
  142. IList<Google.Apis.Drive.v3.Data.File> files = FileListRequest.Execute().Files;
  143. List<GoogleDriveFiles> FileList = new List<GoogleDriveFiles>();
  144. if (files != null && files.Count > 0)
  145. {
  146. foreach (var file in files)
  147. {
  148. GoogleDriveFiles File = new GoogleDriveFiles
  149. {
  150. Id = file.Id,
  151. Name = file.Name,
  152. Size = file.Size,
  153. Version = file.Version,
  154. CreatedTime = file.CreatedTime
  155. };
  156. FileList.Add(File);
  157. }
  158. }
  159. return FileList;
  160. }
  161. /// <summary>
  162. /// 上传文件
  163. /// </summary>
  164. /// <param name="filepath">本地文件路径</param>
  165. public async Task<bool> FileUpload(string filepath)
  166. {
  167. if (Service == null)
  168. Service = await GetServiceAsync();
  169. var FileMetaData = new Google.Apis.Drive.v3.Data.File();
  170. var str = filepath.LastIndexOf("\\");
  171. var str2 = filepath.Substring(str + 1, filepath.Length - str - 1);
  172. FileMetaData.Name = str2;
  173. FileMetaData.MimeType = "";
  174. FilesResource.CreateMediaUpload request;
  175. try
  176. {
  177. using (var stream = new System.IO.FileStream(filepath, System.IO.FileMode.Open))
  178. {
  179. request = Service.Files.Create(FileMetaData, stream, FileMetaData.MimeType);
  180. request.Fields = "id";
  181. request.Upload();
  182. }
  183. return true;
  184. }
  185. catch
  186. {
  187. return false;
  188. }
  189. }
  190. /// <summary>
  191. /// Download file from Google Drive by fileId.
  192. /// </summary>
  193. /// <param name="googleDriveFiles"></param>
  194. /// <param name="savePath"></param>
  195. /// <returns></returns>
  196. //
  197. public async Task<string> DownloadGoogleFile(GoogleDriveFiles googleDriveFiles, string savePath)
  198. {
  199. if (Service == null)
  200. Service = await GetServiceAsync();
  201. string fileId = googleDriveFiles.Id;
  202. if (string.IsNullOrEmpty(fileId))
  203. return "";
  204. //fileId = DriveFiles[0].Id;
  205. FilesResource.GetRequest request = Service.Files.Get(fileId);
  206. string FileName = request.Execute().Name;
  207. string FilePath = System.IO.Path.Combine(savePath, FileName);
  208. MemoryStream stream = new MemoryStream();
  209. // Add a handler which will be notified on progress changes.
  210. // It will notify on each chunk download and when the
  211. // download is completed or failed.
  212. request.MediaDownloader.ProgressChanged += (Google.Apis.Download.IDownloadProgress progress) =>
  213. {
  214. switch (progress.Status)
  215. {
  216. case DownloadStatus.Downloading:
  217. {
  218. Console.WriteLine(progress.BytesDownloaded);
  219. break;
  220. }
  221. case DownloadStatus.Completed:
  222. {
  223. Console.WriteLine("Download complete.");
  224. SaveStream(stream, FilePath);
  225. break;
  226. }
  227. case DownloadStatus.Failed:
  228. {
  229. Console.WriteLine("Download failed.");
  230. break;
  231. }
  232. }
  233. };
  234. request.Download(stream);
  235. if (string.IsNullOrEmpty(savePath) == false)
  236. {
  237. }
  238. return FilePath;
  239. }
  240. private static void SaveStream(MemoryStream stream, string FilePath)
  241. {
  242. using (System.IO.FileStream file = new FileStream(FilePath, FileMode.Create, FileAccess.ReadWrite))
  243. {
  244. stream.WriteTo(file);
  245. }
  246. }
  247. #endregion
  248. }
  249. }