UploadManager.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.Events;
  5. using System.Text;
  6. using Newtonsoft.Json;
  7. using UnityEngine.Networking;
  8. using System.IO;
  9. using System;
  10. using ToneTuneToolkit.Common;
  11. public class UploadManager : SingletonMaster<UploadManager>
  12. {
  13. public static UnityAction<Texture2D> OnUpdateFinishedBackTexture;
  14. public static UnityAction<string> OnUpdateFinishedBackString;
  15. private int appID = 78;
  16. private float retryWaitTime = 30f; // 重新上传尝试间隔
  17. [Header("Token")]
  18. [SerializeField] private TokenCallbackJson tokenJson = new TokenCallbackJson();
  19. [Header("Cloud")]
  20. [SerializeField] private CloudCallbackJson cloudCallbackJson = new CloudCallbackJson();
  21. [Header("Server")]
  22. [SerializeField] private ServerJson serverJson = new ServerJson();
  23. [SerializeField] private ServerCallbackJson serverCallbackJson = new ServerCallbackJson();
  24. private const string cloudTokenURL = @"https://h5.skyelook.com/api/qiniu/getAccessToken";
  25. private const string qiniuURL = @"https://upload.qiniup.com";
  26. private const string cloudURL = @"https://h5.skyelook.com/api/attachments";
  27. // ==================================================
  28. // private void EventNoticeAll()
  29. // {
  30. // if (OnFinalCallbackUpdate == null) // 如果没人订阅
  31. // {
  32. // return;
  33. // }
  34. // OnFinalCallbackUpdate(serverCallbackJson.data.view_url); // 把viewurl丢出去
  35. // return;
  36. // }
  37. // ==================================================
  38. [SerializeField] private string fileName;
  39. [SerializeField] private string filePath;
  40. public void UpdateFileInfo(string nameString, string pathString)
  41. {
  42. fileName = nameString;
  43. filePath = pathString;
  44. return;
  45. }
  46. // ==================================================
  47. #region Step 00 // 获取Token
  48. public void UploadData2Net() => StartCoroutine(nameof(GetTokenFromCloud));
  49. private IEnumerator GetTokenFromCloud()
  50. {
  51. using (UnityWebRequest unityWebRequest = UnityWebRequest.Get(cloudTokenURL))
  52. {
  53. yield return unityWebRequest.SendWebRequest();
  54. if (unityWebRequest.result != UnityWebRequest.Result.Success)
  55. {
  56. Debug.Log($"[UploadManager] {unityWebRequest.error}");
  57. StartCoroutine(nameof(RetryUpload));
  58. }
  59. else
  60. {
  61. tokenJson = JsonConvert.DeserializeObject<TokenCallbackJson>(unityWebRequest.downloadHandler.text);
  62. Debug.Log($"[UploadManager] Get token sucessed: {tokenJson.data.token}");
  63. StartCoroutine(nameof(PoseFile2Cloud)); // 下一步
  64. }
  65. }
  66. yield break;
  67. }
  68. #endregion
  69. // ==================================================
  70. #region Step 01 // 上传文件到七牛云
  71. private IEnumerator PoseFile2Cloud()
  72. {
  73. byte[] bytes = File.ReadAllBytes(filePath); // 文件转流
  74. WWWForm wwwForm = new WWWForm();
  75. wwwForm.AddField("token", tokenJson.data.token);
  76. wwwForm.AddBinaryData("file", bytes, fileName);
  77. using (UnityWebRequest unityWebRequest = UnityWebRequest.Post(qiniuURL, wwwForm))
  78. {
  79. yield return unityWebRequest.SendWebRequest();
  80. if (unityWebRequest.result != UnityWebRequest.Result.Success)
  81. {
  82. Debug.Log($"[UploadManager] {unityWebRequest.error}");
  83. StartCoroutine(nameof(RetryUpload));
  84. }
  85. else
  86. {
  87. cloudCallbackJson = JsonConvert.DeserializeObject<CloudCallbackJson>(unityWebRequest.downloadHandler.text);
  88. Debug.Log($"[UploadManager] Upload sucessed: {cloudCallbackJson.data.file_url}");
  89. StartCoroutine(SaveFile2Server()); // 下一步
  90. }
  91. }
  92. yield break;
  93. }
  94. #endregion
  95. // ==================================================
  96. #region Step 02 // 七牛云返回数据传至服务器
  97. private IEnumerator SaveFile2Server()
  98. {
  99. serverJson.file_url = cloudCallbackJson.data.file_url;
  100. serverJson.app_id = appID;
  101. string jsonString = JsonConvert.SerializeObject(serverJson);
  102. byte[] bytes = Encoding.Default.GetBytes(jsonString);
  103. // Debug.Log(jsonString);
  104. using (UnityWebRequest unityWebRequest = new UnityWebRequest(cloudURL, "POST"))
  105. {
  106. unityWebRequest.SetRequestHeader("Content-Type", "application/json");
  107. unityWebRequest.uploadHandler = new UploadHandlerRaw(bytes);
  108. unityWebRequest.downloadHandler = new DownloadHandlerBuffer();
  109. yield return unityWebRequest.SendWebRequest();
  110. if (unityWebRequest.result != UnityWebRequest.Result.Success)
  111. {
  112. Debug.Log($"[UploadManager] {unityWebRequest.error}");
  113. StartCoroutine(nameof(RetryUpload));
  114. }
  115. else
  116. {
  117. serverCallbackJson = JsonConvert.DeserializeObject<ServerCallbackJson>(unityWebRequest.downloadHandler.text);
  118. // Debug.Log($"{unityWebRequest.downloadHandler.text}");
  119. Debug.Log($"[UploadManager] {serverCallbackJson.data.view_url}");
  120. // 返回链接
  121. if (OnUpdateFinishedBackString != null)
  122. {
  123. OnUpdateFinishedBackString(serverCallbackJson.data.view_url);
  124. }
  125. // 第三步 搞图
  126. sunCodeURL = $"https://h5.skyelook.com/api/wechat/getQrcodeApp/{serverCallbackJson.data.code}/wx039a4c76d8788bb0";
  127. // EventNoticeAll(); // 钩子在此
  128. StartCoroutine(nameof(GetSunCode4Server));
  129. }
  130. }
  131. yield break;
  132. }
  133. #endregion
  134. // ==================================================
  135. #region Step 03 // 从服务器上获取码
  136. [SerializeField] private string sunCodeURL;
  137. [SerializeField] private Texture2D finalSunCode;
  138. private IEnumerator GetSunCode4Server()
  139. {
  140. using (UnityWebRequest unityWebRequest = UnityWebRequestTexture.GetTexture(sunCodeURL)) // new UnityWebRequest(sunCodeURL, "GET"))
  141. {
  142. yield return unityWebRequest.SendWebRequest();
  143. if (unityWebRequest.result != UnityWebRequest.Result.Success)
  144. {
  145. Debug.Log("[UM] " + unityWebRequest.error);
  146. }
  147. else
  148. {
  149. // td = new Texture2D(600, 600);
  150. // td.LoadImage(unityWebRequest.tex);
  151. finalSunCode = ((DownloadHandlerTexture)unityWebRequest.downloadHandler).texture;
  152. // 返回图
  153. if (OnUpdateFinishedBackTexture != null)
  154. {
  155. OnUpdateFinishedBackTexture(((DownloadHandlerTexture)unityWebRequest.downloadHandler).texture);
  156. }
  157. }
  158. }
  159. yield break;
  160. }
  161. #endregion
  162. // ==================================================
  163. /// <summary>
  164. /// 传不上去硬传
  165. /// </summary>
  166. /// <returns></returns>
  167. private IEnumerator RetryUpload()
  168. {
  169. yield return new WaitForSeconds(retryWaitTime);
  170. PoseFile2Cloud();
  171. yield break;
  172. }
  173. // ==================================================
  174. // Json解析类
  175. // 七牛云Token回执
  176. [Serializable]
  177. public class TokenCallbackJson
  178. {
  179. public int status;
  180. public int code;
  181. public TokenDataJson data;
  182. public string message;
  183. }
  184. [Serializable]
  185. public class TokenDataJson
  186. {
  187. public string token;
  188. }
  189. // 七牛云文件上传回执
  190. [Serializable]
  191. public class CloudCallbackJson
  192. {
  193. public int code;
  194. public CloudCallbackDataJson data;
  195. public int status;
  196. }
  197. [Serializable]
  198. public class CloudCallbackDataJson
  199. {
  200. public string file_name;
  201. public string file_url;
  202. }
  203. // 向服务器发送的json
  204. [Serializable]
  205. public class ServerJson
  206. {
  207. public string file_url;
  208. public int app_id;
  209. // public string options;
  210. }
  211. [Serializable]
  212. public class ServerCallbackJson
  213. {
  214. public int status;
  215. public int code;
  216. public ServerCallbackDataJson data;
  217. }
  218. [Serializable]
  219. public class ServerCallbackDataJson
  220. {
  221. public string file_url;
  222. public int app_id;
  223. public string code;
  224. public string view_url;
  225. public string updated_at;
  226. public string created_at;
  227. public int id;
  228. }
  229. }