fisp.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. using COSXML;
  2. using COSXML.Auth;
  3. using COSXML.Model.Object;
  4. using COSXML.Transfer;
  5. using static COSXML.Model.Tag.ListAllMyBuckets;
  6. namespace libfisp
  7. {
  8. public class fisp
  9. {
  10. private const string _bucket = @"app-1300984704";
  11. private readonly CosXmlServer _cosXml;
  12. public fisp()
  13. {
  14. var secretId = "AKIDMSIsADUUpvJGwJOKvsb5IDrGtGNBRzzi";
  15. var secretKey = "4sQhdJBl5HI7f3oLbZIlwqXOyILyLWP0";
  16. var region = "ap-shanghai";
  17. var config = new CosXmlConfig.Builder()
  18. .SetRegion(region)
  19. .SetConnectionTimeoutMs(10000)
  20. .SetReadWriteTimeoutMs(10000)
  21. .SetDebugLog(true)
  22. .Build();
  23. var qCloudCredentialProvider = new DefaultQCloudCredentialProvider(secretId, secretKey, 3600);
  24. _cosXml = new CosXmlServer(config, qCloudCredentialProvider);
  25. }
  26. private async Task<string> PutObject(string file, string fileName, Action<long,long> progressCallback)
  27. {
  28. var transferConfig = new TransferConfig();
  29. var transferManager = new TransferManager(_cosXml, transferConfig);
  30. var uploadTask = new COSXMLUploadTask(_bucket, fileName);
  31. uploadTask.SetSrcPath(file);
  32. uploadTask.progressCallback = new COSXML.Callback.OnProgressCallback(progressCallback);
  33. try
  34. {
  35. var result = await transferManager.UploadAsync(uploadTask);
  36. if (result.IsSuccessful())
  37. {
  38. return "success";
  39. }
  40. else
  41. {
  42. return result.GetResultInfo();
  43. }
  44. }
  45. catch (Exception e)
  46. {
  47. return e.ToString();
  48. }
  49. }
  50. public List<string> ListFolders(string prefix)
  51. {
  52. var request = new COSXML.Model.Bucket.GetBucketRequest(_bucket);
  53. if (!string.IsNullOrEmpty(prefix))
  54. {
  55. request.SetPrefix(prefix);
  56. }
  57. request.SetDelimiter("/");
  58. var result = _cosXml.GetBucket(request);
  59. if (result.IsSuccessful())
  60. {
  61. return result.listBucket.commonPrefixesList.Select(x => x.prefix).ToList();
  62. }
  63. else
  64. {
  65. throw new InvalidOperationException("List bucket failed.");
  66. }
  67. }
  68. public DeleteTask DeleteFolder(string folderName)
  69. {
  70. var deleteTask = new DeleteTask();
  71. Task.Run(() =>
  72. {
  73. try
  74. {
  75. var isSuccess = true;
  76. var getRequest = new COSXML.Model.Bucket.GetBucketRequest(_bucket);
  77. getRequest.SetPrefix(folderName);
  78. var getResult = _cosXml.GetBucket(getRequest);
  79. if (getResult.IsSuccessful())
  80. {
  81. var files = getResult.listBucket.contentsList.Select(x => x.key).ToArray();
  82. for (var i = 0; i < files.Length; i++)
  83. {
  84. var file = files[i];
  85. var deleteRequest = new DeleteObjectRequest(_bucket, file);
  86. var deleteResult = _cosXml.DeleteObject(deleteRequest);
  87. if (deleteResult.IsSuccessful())
  88. {
  89. deleteTask.UpdateProgress((i + 1) * 100 / files.Length);
  90. }
  91. else
  92. {
  93. deleteTask.UpdateFailed(deleteResult.GetResultInfo());
  94. isSuccess = false;
  95. break;
  96. }
  97. }
  98. if (isSuccess)
  99. {
  100. deleteTask.UpdateSuccess();
  101. }
  102. }
  103. else
  104. {
  105. deleteTask.UpdateFailed("List folders failed.");
  106. }
  107. }
  108. catch (Exception ex)
  109. {
  110. deleteTask.UpdateFailed(ex.Message);
  111. }
  112. });
  113. return deleteTask;
  114. }
  115. private Dictionary<string, string> GetDirFiles(DirectoryInfo dirInfo, string parentDirName)
  116. {
  117. var files = new Dictionary<string, string>();
  118. var subDirInfos = dirInfo.GetDirectories();
  119. foreach (var subDirInfo in subDirInfos)
  120. {
  121. var subFiles = GetDirFiles(subDirInfo, parentDirName + "/" + subDirInfo.Name);
  122. foreach (var subFilePath in subFiles.Keys)
  123. {
  124. files.Add(subFilePath, subFiles[subFilePath]);
  125. }
  126. }
  127. var dirFiles = dirInfo.GetFiles();
  128. foreach (var dirFile in dirFiles)
  129. {
  130. var fileName = parentDirName + "/" + dirFile.Name;
  131. files.Add(dirFile.FullName, fileName);
  132. }
  133. return files;
  134. }
  135. public UploadTask UploadFile(string file, string fileName)
  136. {
  137. var uploadTask = new UploadTask();
  138. Task.Run(async () =>
  139. {
  140. var result = await PutObject(file, fileName, (progress, total) => { uploadTask.UpdateUploadProgress(file, progress * 100 / total); });
  141. if (result == "success")
  142. {
  143. uploadTask.UpdateSuccess();
  144. }
  145. else
  146. {
  147. uploadTask.UpdateFailed(result);
  148. }
  149. });
  150. return uploadTask;
  151. }
  152. public UploadTask UploadDir(string dir, string dirName)
  153. {
  154. var dirInfo = new DirectoryInfo(dir);
  155. var uploadFiles = GetDirFiles(dirInfo, dirName);
  156. var uploadTask = new UploadTask();
  157. Task.Run(async () =>
  158. {
  159. bool isSuccess = true;
  160. var files = uploadFiles.Keys.ToArray();
  161. for(var i=0;i< files.Length; i++)
  162. {
  163. var file = files[i];
  164. var fileName = uploadFiles[file];
  165. var result = await PutObject(file, fileName, (progress, total) => { uploadTask.UpdateUploadProgress(file, progress * 100 / total); });
  166. if (result == "success")
  167. {
  168. uploadTask.UpdateTotalProgress((i + 1) * 100 / files.Length);
  169. }
  170. else
  171. {
  172. uploadTask.UpdateFailed(result);
  173. isSuccess = false;
  174. break;
  175. }
  176. }
  177. if (isSuccess)
  178. {
  179. uploadTask.UpdateSuccess();
  180. }
  181. });
  182. return uploadTask;
  183. }
  184. }
  185. }