COSDownLoad.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using COSXML;
  5. using COSXML.Auth;
  6. using COSXML.Model.Object;
  7. using COSXML.Model.Bucket;
  8. using COSXML.CosException;
  9. using System;
  10. using Newtonsoft.Json;
  11. using LitJson;
  12. using System.Threading.Tasks;
  13. using COSXML.Transfer;
  14. using System.IO;
  15. using COSXML.Model;
  16. using Newtonsoft.Json.Linq;
  17. public class COSDownLoad:MonoSingleton<COSDownLoad>
  18. {
  19. /*
  20. * 根据下载的类型 分为 -1 Scene Materail -2 vuforial
  21. *
  22. */
  23. public SuccessCOS materialSuccessCos;
  24. public SuccessCOS sceneSuccessCos;
  25. public SuccessCOS imageSuccessCos;
  26. // QCloudCredentialProvider cosCredentialProvider;
  27. CosXml materialCosXml;
  28. CosXml sceneCosXml;
  29. CosXml imageCosXml;
  30. // Start is called before the first frame update
  31. public void Credential()
  32. {
  33. Credential credential = new Credential();
  34. credential.type = "material";
  35. string data = JsonConvert.SerializeObject(credential);
  36. Debug.Log(data);
  37. HttpTool.Instance.Post("/storage/credential/create", data, CredentialMaterialCallBack);
  38. Credential credential2 = new Credential();
  39. credential2.type = "scene";
  40. string data2 = JsonConvert.SerializeObject(credential2);
  41. HttpTool.Instance.Post("/storage/credential/create", data2, CredentialSceneCallBack);
  42. Credential credential3 = new Credential();
  43. credential3.type = "image";
  44. string data3 = JsonConvert.SerializeObject(credential3);
  45. HttpTool.Instance.Post("/storage/credential/create", data3, CredentialImageCallBack);
  46. }
  47. private void InitMaterialCos()
  48. {
  49. CosXmlConfig config = new CosXmlConfig.Builder()
  50. .IsHttps(true)
  51. .SetRegion(materialSuccessCos.region)
  52. .SetDebugLog(true)
  53. .Build();
  54. QCloudCredentialProvider cosCredentialProvider = new DefaultSessionQCloudCredentialProvider(
  55. materialSuccessCos.credentials.tmpSecretId, materialSuccessCos.credentials.tmpSecretKey, materialSuccessCos.expiredTime, materialSuccessCos.credentials.sessionToken);
  56. materialCosXml = new CosXmlServer(config, cosCredentialProvider);
  57. }
  58. private void InitImageCos()
  59. {
  60. CosXmlConfig config = new CosXmlConfig.Builder()
  61. .IsHttps(true)
  62. .SetRegion(imageSuccessCos.region)
  63. .SetDebugLog(true)
  64. .Build();
  65. QCloudCredentialProvider cosCredentialProvider = new DefaultSessionQCloudCredentialProvider(
  66. imageSuccessCos.credentials.tmpSecretId, imageSuccessCos.credentials.tmpSecretKey, imageSuccessCos.expiredTime, imageSuccessCos.credentials.sessionToken);
  67. imageCosXml = new CosXmlServer(config, cosCredentialProvider);
  68. }
  69. private void InitSceneCos()
  70. {
  71. CosXmlConfig config = new CosXmlConfig.Builder()
  72. .IsHttps(true)
  73. .SetRegion(sceneSuccessCos.region)
  74. .SetDebugLog(true)
  75. .Build();
  76. QCloudCredentialProvider cosCredentialProvider = new DefaultSessionQCloudCredentialProvider(
  77. sceneSuccessCos.credentials.tmpSecretId, sceneSuccessCos.credentials.tmpSecretKey, sceneSuccessCos.expiredTime, sceneSuccessCos.credentials.sessionToken);
  78. sceneCosXml = new CosXmlServer(config, cosCredentialProvider);
  79. }
  80. private void CredentialMaterialCallBack( string msg)
  81. {
  82. Debug.Log(msg);
  83. JObject jObject = JObject.Parse(msg);
  84. if (jObject["code"].ToString() == "200")
  85. {
  86. materialSuccessCos = JsonConvert.DeserializeObject<SuccessCOS>(jObject["data"].ToString());
  87. InitMaterialCos();
  88. }
  89. else
  90. {
  91. Debug.LogError(msg);
  92. }
  93. }
  94. private void CredentialSceneCallBack(string msg)
  95. {
  96. Debug.Log(msg);
  97. JObject jObject = JObject.Parse(msg);
  98. if (jObject["code"].ToString() == "200")
  99. {
  100. sceneSuccessCos = JsonConvert.DeserializeObject<SuccessCOS>(jObject["data"].ToString());
  101. InitSceneCos();
  102. }
  103. else
  104. {
  105. Debug.LogError(msg);
  106. }
  107. }
  108. private void CredentialImageCallBack(string msg)
  109. {
  110. Debug.Log(msg);
  111. JObject jObject = JObject.Parse(msg);
  112. if (jObject["code"].ToString() == "200")
  113. {
  114. imageSuccessCos = JsonConvert.DeserializeObject<SuccessCOS>(jObject["data"].ToString());
  115. InitImageCos();
  116. }
  117. else
  118. {
  119. Debug.LogError(msg);
  120. }
  121. }
  122. public static int showDownLoadCount;
  123. public static int showDownEndLoadCount;
  124. public static float showDownLoadPre;
  125. /// <summary>
  126. /// 高级接口下载对象
  127. /// </summary>
  128. /// <param name="cosPath"> 下载地址 </param>
  129. /// <param name="localDir"> 本地保存文件夹</param>
  130. /// <param name="localFileName"> 本地保存文件名</param>
  131. /// <returns></returns>
  132. public async void TransferDownloadObject(DownLoadMaterial downloadMaterial, string localDir)
  133. {
  134. // 初始化 TransferConfig
  135. TransferConfig transferConfig = new TransferConfig();
  136. // 手动设置高级下载接口的分块阈值为 20MB(默认为20MB), 从5.4.26版本开始支持!
  137. //transferConfig.DivisionForDownload = 20 * 1024 * 1024;
  138. // 手动设置高级下载接口的分块大小为 10MB(默认为5MB),不建议此处设置过小的分块值,可能导致频繁重试或下载速度不合预期
  139. //transferConfig.SliceSizeForDownload = 10 * 1024 * 1024;
  140. TransferManager transferManager; // 初始化 TransferManager
  141. String bucket; //存储桶,格式:BucketName-APPID
  142. Debug.Log("Hjj TransferDownloadObject===>"+ downloadMaterial.type);
  143. switch (downloadMaterial.type)
  144. {
  145. case "-1":
  146. transferManager = new TransferManager(sceneCosXml, transferConfig);
  147. bucket = sceneSuccessCos.bucket;
  148. break;
  149. case "-2":
  150. transferManager = new TransferManager(imageCosXml, transferConfig);
  151. bucket = imageSuccessCos.bucket;
  152. break;
  153. default:
  154. transferManager = new TransferManager(materialCosXml, transferConfig);
  155. bucket = materialSuccessCos.bucket;
  156. break;
  157. }
  158. // String cosPath = "exampleobject"; //对象在存储桶中的位置标识符,即称对象键
  159. // string localDir = System.IO.Path.GetTempPath();//本地文件夹
  160. // string localFileName = "my-local-temp-file"; //指定本地保存的文件名
  161. string localFileName = Path.GetFileName(downloadMaterial.downLoadPath);
  162. localDir = downloadMaterial.localLoadPath.Substring(0, downloadMaterial.localLoadPath.Length - localFileName.Length);
  163. // 下载对象
  164. COSXMLDownloadTask downloadTask = new COSXMLDownloadTask(bucket, downloadMaterial.downLoadPath,
  165. localDir, localFileName);
  166. // 手动设置高级下载接口的并发数 (默认为5), 从5.4.26版本开始支持!
  167. //downloadTask.SetMaxTasks(10);
  168. downloadTask.progressCallback = delegate (long completed, long total)
  169. {
  170. // Debug.Log(String.Format("Hjj download"+downloadMaterial.downLoadPath+"progress = {0:##.##}%", completed * 100.0 / total));
  171. showDownLoadPre = completed * 100.0f / total;
  172. };
  173. Debug.Log(downloadMaterial.downLoadPath +"||||||||| DGJ");
  174. downloadTask.onState += OnState;
  175. listDownLoadTask.Add(downloadTask);
  176. try
  177. {
  178. COSXML.Transfer.COSXMLDownloadTask.DownloadTaskResult result = await
  179. transferManager.DownloadAsync(downloadTask);
  180. Console.WriteLine(result.GetResultInfo());
  181. string eTag = result.eTag;
  182. }
  183. catch (COSXML.CosException.CosClientException clientEx)
  184. {
  185. //请求失败
  186. Debug.LogError(downloadMaterial.downLoadPath + " CosClientException: " + clientEx);
  187. DownloadResManager.Instance.DownLoadFaild(downloadTask.localFileName);
  188. listDownLoadTask.Remove(downloadTask);
  189. showDownEndLoadCount++;
  190. }
  191. catch (COSXML.CosException.CosServerException serverEx)
  192. {
  193. //请求失败
  194. Debug.LogError(downloadMaterial.downLoadPath+ " CosServerException: " + serverEx.GetInfo());
  195. DownloadResManager.Instance.DownLoadFaild(downloadTask.localFileName);
  196. listDownLoadTask.Remove(downloadTask);
  197. showDownEndLoadCount++;
  198. }
  199. }
  200. private List<COSXML.Transfer.COSXMLDownloadTask.DownloadTaskResult> listResult = new List<COSXMLDownloadTask.DownloadTaskResult>();
  201. private List<COSXMLDownloadTask> listDownLoadTask = new List<COSXMLDownloadTask>();
  202. /// <summary>
  203. /// 批量下载
  204. /// </summary>
  205. /// <param name="listDLMaterial">素材列表 </param>
  206. /// <param name="localDir"> 本地下载文件夹 </param>
  207. public async void TransferBatchDownloadObjects( List<DownLoadMaterial> listDLMaterial , string localDir)
  208. {
  209. if (listDLMaterial.Count == 0 || listDLMaterial == null)
  210. return;
  211. //.cssg-snippet-body-start:[transfer-batch-download-objects]
  212. TransferConfig transferConfig = new TransferConfig();
  213. // 初始化 TransferManager
  214. TransferManager transferManager = new TransferManager(materialCosXml, transferConfig);
  215. // 存储桶名称,此处填入格式必须为 bucketname-APPID, 其中 APPID 获取参考 https://console.cloud.tencent.com/developer
  216. string bucket = materialSuccessCos.bucket;
  217. //string localDir = System.IO.Path.GetTempPath();//本地文件夹
  218. Debug.Log(listDLMaterial.Count);
  219. for (int i = 0; i < listDLMaterial.Count; i++)
  220. {
  221. string cosPath = listDLMaterial[i].downLoadPath;
  222. Debug.Log(cosPath);
  223. if(cosPath==null||cosPath=="")
  224. {
  225. DownloadResManager.Instance.DownLoadFaild(listDLMaterial[i].localLoadPath);
  226. continue;
  227. }
  228. string localFileName = Path.GetFileName(listDLMaterial[i].localLoadPath);
  229. Debug.Log(cosPath + " " + localDir + localFileName);
  230. COSXMLDownloadTask downloadTask = new COSXMLDownloadTask(bucket, cosPath,
  231. localDir, localFileName);
  232. downloadTask.failCallback = delegate (CosClientException clientException, CosServerException serverException)
  233. {
  234. Debug.LogError("clientException.errorCode : " + clientException.errorCode + " serverException.errorCode: " + serverException.errorCode +
  235. " serverException.errorMessage : " + serverException.errorMessage);
  236. };
  237. downloadTask.onState += OnState;
  238. try
  239. {
  240. await transferManager.DownloadAsync(downloadTask);
  241. }
  242. catch (COSXML.CosException.CosClientException clientEx)
  243. {
  244. //请求失败
  245. Debug.LogError("CosClientException: " + clientEx);
  246. DownloadResManager.Instance.DownLoadFaild(downloadTask.localFileName);
  247. listDownLoadTask.RemoveAt(0);
  248. }
  249. catch (COSXML.CosException.CosServerException serverEx)
  250. {
  251. //请求失败
  252. Debug.LogError("CosServerException: " + serverEx.GetInfo());
  253. DownloadResManager.Instance.DownLoadFaild(downloadTask.localFileName);
  254. listDownLoadTask.RemoveAt(0);
  255. }
  256. listDownLoadTask.Add(downloadTask);
  257. }
  258. }
  259. public Queue<TaskState> taskQueue = new Queue<TaskState>();
  260. private void OnState(TaskState state)
  261. {
  262. taskQueue.Enqueue(state);
  263. }
  264. private void Update()
  265. {
  266. if(taskQueue.Count>0)
  267. {
  268. var state = taskQueue.Dequeue();
  269. if (state == TaskState.Completed || state == TaskState.Failed)
  270. {
  271. int ct = listDownLoadTask.Count - 1;
  272. for (int i = ct; i >= 0; i--)
  273. {
  274. if (listDownLoadTask[i].State() == TaskState.Completed)
  275. {
  276. showDownEndLoadCount++;
  277. Debug.Log(listDownLoadTask.Count + " " + listDownLoadTask[i].State() + " " + listDownLoadTask[i].localFileName);
  278. DownloadResManager.Instance.DownLoadCompleted(listDownLoadTask[i].localFileName);
  279. listDownLoadTask.RemoveAt(i);
  280. }else if (listDownLoadTask[i].State() == TaskState.Failed)
  281. {
  282. showDownEndLoadCount++;
  283. Debug.Log(listDownLoadTask.Count + " " + listDownLoadTask[i].State() + " " + listDownLoadTask[i].localFileName);
  284. DownloadResManager.Instance.DownLoadFaild(listDownLoadTask[i].localFileName);
  285. listDownLoadTask.RemoveAt(i);
  286. }
  287. }
  288. }
  289. }
  290. }
  291. }
  292. public class Credential
  293. {
  294. public string type { get; set; }
  295. }
  296. public class SuccessCOS
  297. {
  298. public CredentialsCos credentials { get; set; }
  299. public long startTime { get; set; }
  300. public long expiredTime { get; set; }
  301. public string bucket { get; set; }
  302. public string path { get; set; }
  303. public string region { get; set; }
  304. }
  305. public class CredentialsCos
  306. {
  307. public string tmpSecretId { get; set; }
  308. public string tmpSecretKey { get; set; }
  309. public string sessionToken { get; set; }
  310. }