COSDownLoad.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  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. InitMaterialCos();
  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. /// <summary>
  123. /// 高级接口下载对象
  124. /// </summary>
  125. /// <param name="cosPath"> 下载地址 </param>
  126. /// <param name="localDir"> 本地保存文件夹</param>
  127. /// <param name="localFileName"> 本地保存文件名</param>
  128. /// <returns></returns>
  129. public async void TransferDownloadObject(DownLoadMaterial downloadMaterial, string localDir)
  130. {
  131. // 初始化 TransferConfig
  132. TransferConfig transferConfig = new TransferConfig();
  133. // 手动设置高级下载接口的分块阈值为 20MB(默认为20MB), 从5.4.26版本开始支持!
  134. //transferConfig.DivisionForDownload = 20 * 1024 * 1024;
  135. // 手动设置高级下载接口的分块大小为 10MB(默认为5MB),不建议此处设置过小的分块值,可能导致频繁重试或下载速度不合预期
  136. //transferConfig.SliceSizeForDownload = 10 * 1024 * 1024;
  137. TransferManager transferManager; // 初始化 TransferManager
  138. String bucket; //存储桶,格式:BucketName-APPID
  139. switch (downloadMaterial.type)
  140. {
  141. case "-1":
  142. transferManager = new TransferManager(sceneCosXml, transferConfig);
  143. bucket = sceneSuccessCos.bucket;
  144. break;
  145. case "-2":
  146. transferManager = new TransferManager(imageCosXml, transferConfig);
  147. bucket = imageSuccessCos.bucket;
  148. break;
  149. default:
  150. transferManager = new TransferManager(materialCosXml, transferConfig);
  151. bucket = materialSuccessCos.bucket;
  152. break;
  153. }
  154. // String cosPath = "exampleobject"; //对象在存储桶中的位置标识符,即称对象键
  155. // string localDir = System.IO.Path.GetTempPath();//本地文件夹
  156. // string localFileName = "my-local-temp-file"; //指定本地保存的文件名
  157. string localFileName = Path.GetFileName(downloadMaterial.downLoadPath);
  158. localDir = downloadMaterial.localLoadPath.Substring(0, downloadMaterial.localLoadPath.Length - localFileName.Length);
  159. // 下载对象
  160. COSXMLDownloadTask downloadTask = new COSXMLDownloadTask(bucket, downloadMaterial.downLoadPath,
  161. localDir, localFileName);
  162. // 手动设置高级下载接口的并发数 (默认为5), 从5.4.26版本开始支持!
  163. //downloadTask.SetMaxTasks(10);
  164. //downloadTask.progressCallback = delegate (long completed, long total)
  165. //{
  166. // Console.WriteLine(String.Format("progress = {0:##.##}%", completed * 100.0 / total));
  167. //};
  168. Debug.Log(downloadMaterial.downLoadPath);
  169. downloadTask.onState += OnState;
  170. listDownLoadTask.Add(downloadTask);
  171. try
  172. {
  173. COSXML.Transfer.COSXMLDownloadTask.DownloadTaskResult result = await
  174. transferManager.DownloadAsync(downloadTask);
  175. Console.WriteLine(result.GetResultInfo());
  176. string eTag = result.eTag;
  177. }
  178. catch (COSXML.CosException.CosClientException clientEx)
  179. {
  180. //请求失败
  181. Debug.LogError(downloadMaterial.downLoadPath + " CosClientException: " + clientEx);
  182. DownloadResManager.Instance.DownLoadFaild(downloadTask.localFileName);
  183. listDownLoadTask.RemoveAt(0);
  184. }
  185. catch (COSXML.CosException.CosServerException serverEx)
  186. {
  187. //请求失败
  188. Debug.LogError(downloadMaterial.downLoadPath+ " CosServerException: " + serverEx.GetInfo());
  189. DownloadResManager.Instance.DownLoadFaild(downloadTask.localFileName);
  190. listDownLoadTask.RemoveAt(0);
  191. }
  192. }
  193. private List<COSXML.Transfer.COSXMLDownloadTask.DownloadTaskResult> listResult = new List<COSXMLDownloadTask.DownloadTaskResult>();
  194. private List<COSXMLDownloadTask> listDownLoadTask = new List<COSXMLDownloadTask>();
  195. /// <summary>
  196. /// 批量下载
  197. /// </summary>
  198. /// <param name="listDLMaterial">素材列表 </param>
  199. /// <param name="localDir"> 本地下载文件夹 </param>
  200. public async void TransferBatchDownloadObjects( List<DownLoadMaterial> listDLMaterial , string localDir)
  201. {
  202. if (listDLMaterial.Count == 0 || listDLMaterial == null)
  203. return;
  204. //.cssg-snippet-body-start:[transfer-batch-download-objects]
  205. TransferConfig transferConfig = new TransferConfig();
  206. // 初始化 TransferManager
  207. TransferManager transferManager = new TransferManager(materialCosXml, transferConfig);
  208. // 存储桶名称,此处填入格式必须为 bucketname-APPID, 其中 APPID 获取参考 https://console.cloud.tencent.com/developer
  209. string bucket = materialSuccessCos.bucket;
  210. //string localDir = System.IO.Path.GetTempPath();//本地文件夹
  211. Debug.Log(listDLMaterial.Count);
  212. for (int i = 0; i < listDLMaterial.Count; i++)
  213. {
  214. string cosPath = listDLMaterial[i].downLoadPath;
  215. Debug.Log(cosPath);
  216. if(cosPath==null||cosPath=="")
  217. {
  218. DownloadResManager.Instance.DownLoadFaild(listDLMaterial[i].localLoadPath);
  219. continue;
  220. }
  221. string localFileName = Path.GetFileName(listDLMaterial[i].localLoadPath);
  222. Debug.Log(cosPath + " " + localDir + localFileName);
  223. COSXMLDownloadTask downloadTask = new COSXMLDownloadTask(bucket, cosPath,
  224. localDir, localFileName);
  225. downloadTask.failCallback = delegate (CosClientException clientException, CosServerException serverException)
  226. {
  227. Debug.LogError("clientException.errorCode : " + clientException.errorCode + " serverException.errorCode: " + serverException.errorCode +
  228. " serverException.errorMessage : " + serverException.errorMessage);
  229. };
  230. downloadTask.onState += OnState;
  231. try
  232. {
  233. await transferManager.DownloadAsync(downloadTask);
  234. }
  235. catch (COSXML.CosException.CosClientException clientEx)
  236. {
  237. //请求失败
  238. Debug.LogError("CosClientException: " + clientEx);
  239. DownloadResManager.Instance.DownLoadFaild(downloadTask.localFileName);
  240. listDownLoadTask.RemoveAt(0);
  241. }
  242. catch (COSXML.CosException.CosServerException serverEx)
  243. {
  244. //请求失败
  245. Debug.LogError("CosServerException: " + serverEx.GetInfo());
  246. DownloadResManager.Instance.DownLoadFaild(downloadTask.localFileName);
  247. listDownLoadTask.RemoveAt(0);
  248. }
  249. listDownLoadTask.Add(downloadTask);
  250. }
  251. }
  252. public string GetVideoUrl(DownloadManager downloadMaterial)
  253. {
  254. try
  255. {
  256. string requestURL = materialCosXml.GetObjectUrl(materialSuccessCos.bucket, downloadMaterial.LocaDataPath);
  257. return requestURL;
  258. }
  259. catch (COSXML.CosException.CosClientException clientEx)
  260. {
  261. //请求失败
  262. return null;
  263. }
  264. catch (COSXML.CosException.CosServerException serverEx)
  265. {
  266. //请求失败
  267. return null;
  268. }
  269. }
  270. private void OnState(TaskState state)
  271. {
  272. Debug.Log(state);
  273. if (state == TaskState.Completed || state == TaskState.Failed)
  274. for (int i = 0; i < listDownLoadTask.Count; i++)
  275. {
  276. Debug.Log(listDownLoadTask.Count + " " + listDownLoadTask[i].State() + " " + listDownLoadTask[i].localFileName);
  277. if (listDownLoadTask[i].State() == TaskState.Completed)
  278. {
  279. DownloadResManager.Instance.DownLoadCompleted(listDownLoadTask[i].localFileName);
  280. listDownLoadTask.RemoveAt(i);
  281. }
  282. if (listDownLoadTask[i].State() == TaskState.Failed)
  283. {
  284. DownloadResManager.Instance.DownLoadFaild(listDownLoadTask[i].localFileName);
  285. listDownLoadTask.RemoveAt(i);
  286. }
  287. }
  288. }
  289. }
  290. public class Credential
  291. {
  292. public string type { get; set; }
  293. }
  294. public class SuccessCOS
  295. {
  296. public CredentialsCos credentials { get; set; }
  297. public long startTime { get; set; }
  298. public long expiredTime { get; set; }
  299. public string bucket { get; set; }
  300. public string path { get; set; }
  301. public string region { get; set; }
  302. }
  303. public class CredentialsCos
  304. {
  305. public string tmpSecretId { get; set; }
  306. public string tmpSecretKey { get; set; }
  307. public string sessionToken { get; set; }
  308. }