UploadManager.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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. namespace OwnTheFloor
  9. {
  10. public class UploadManager : MonoBehaviour
  11. {
  12. public static UploadManager Instance;
  13. private event UnityAction<string, string> OnFinalCallbackUpdate; // sting形参
  14. private int appID = 78;
  15. private float retryWaitTime = 30f; // 重新上传尝试间隔
  16. private Texture2D currentTexture2D;
  17. private string currentFileName;
  18. private TokenJson tokenJson = new TokenJson();
  19. private CloudCallbackJson cloudCallbackJson = new CloudCallbackJson();
  20. private ServerJson serverJson = new ServerJson();
  21. private ServerCallbackJson serverCallbackJson = new ServerCallbackJson();
  22. // ==================================================
  23. private void Awake()
  24. {
  25. Instance = this;
  26. }
  27. // ==================================================
  28. public void AddEventListener(UnityAction<string, string> unityAction)
  29. {
  30. OnFinalCallbackUpdate += unityAction;
  31. return;
  32. }
  33. public void RemoveEventListener(UnityAction<string, string> unityAction)
  34. {
  35. OnFinalCallbackUpdate -= unityAction;
  36. return;
  37. }
  38. private void EventNoticeAll()
  39. {
  40. if (OnFinalCallbackUpdate == null) // 如果没人订阅
  41. {
  42. return;
  43. }
  44. // OnFinalCallbackUpdate(serverCallbackJson.data.view_url); // 把viewurl丢出去
  45. OnFinalCallbackUpdate(serverCallbackJson.data.view_url, serverCallbackJson.data.file_url); // 把fileurl丢出去
  46. return;
  47. }
  48. // ==================================================
  49. /// <summary>
  50. ///
  51. /// </summary>
  52. /// <param name="fileTexture"></param>
  53. /// <param name="fileName"></param>
  54. public void UploadData2Net(Texture2D fileTexture, string fileName)
  55. {
  56. currentTexture2D = fileTexture;
  57. currentFileName = fileName;
  58. StartCoroutine(GetToken4Cloud());
  59. return;
  60. }
  61. /// <summary>
  62. /// 获取Token
  63. /// 第一步
  64. /// </summary>
  65. /// <returns></returns>
  66. private IEnumerator GetToken4Cloud()
  67. {
  68. string url = @"https://h5.skyelook.com/api/qiniu/getAccessToken";
  69. using (UnityWebRequest unityWebRequest = UnityWebRequest.Get(url))
  70. {
  71. yield return unityWebRequest.SendWebRequest();
  72. if (unityWebRequest.result != UnityWebRequest.Result.Success)
  73. {
  74. Debug.Log(unityWebRequest.error + "...<color=red>[ER]</color>");
  75. StartCoroutine(RetryUpload());
  76. }
  77. else
  78. {
  79. tokenJson = JsonConvert.DeserializeObject<TokenJson>(unityWebRequest.downloadHandler.text);
  80. Debug.Log($"Get token sucessed: {tokenJson.data.token}...<color=green>[OK]</color>");
  81. StartCoroutine(UploadData2Cloud());
  82. }
  83. }
  84. yield break;
  85. }
  86. /// <summary>
  87. /// 上传文件到七牛云
  88. /// 第二步
  89. /// </summary>
  90. private IEnumerator UploadData2Cloud()
  91. {
  92. string url = @"https://upload.qiniup.com";
  93. byte[] bytes = currentTexture2D.EncodeToPNG();
  94. WWWForm wwwForm = new WWWForm();
  95. wwwForm.AddField("token", tokenJson.data.token);
  96. wwwForm.AddBinaryData("file", bytes, currentFileName);
  97. using (UnityWebRequest unityWebRequest = UnityWebRequest.Post(url, wwwForm))
  98. {
  99. // unityWebRequest.SetRequestHeader("Content-Type", "multipart/form-data;charset=utf-8");
  100. // unityWebRequest.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  101. // unityWebRequest.SetRequestHeader("Content-Type", "application/json");
  102. yield return unityWebRequest.SendWebRequest();
  103. if (unityWebRequest.result != UnityWebRequest.Result.Success)
  104. {
  105. Debug.Log(unityWebRequest.error + "...<color=red>[ER]</color>");
  106. StartCoroutine(RetryUpload());
  107. }
  108. else
  109. {
  110. cloudCallbackJson = JsonConvert.DeserializeObject<CloudCallbackJson>(unityWebRequest.downloadHandler.text);
  111. Debug.Log($"Upload sucessed: {cloudCallbackJson.data.file_url}...<color=green>[OK]</color>");
  112. StartCoroutine(SaveFile2Server());
  113. }
  114. }
  115. yield break;
  116. }
  117. /// <summary>
  118. /// 七牛云返回数据传至服务器
  119. /// 第三步
  120. /// </summary>
  121. /// <returns></returns>
  122. private IEnumerator SaveFile2Server()
  123. {
  124. string url = "https://h5.skyelook.com/api/attachments";
  125. serverJson.file_url = cloudCallbackJson.data.file_url;
  126. serverJson.app_id = appID;
  127. // serverJson.options = "google-gds-print";
  128. string jsonString = JsonConvert.SerializeObject(serverJson);
  129. byte[] bytes = Encoding.Default.GetBytes(jsonString);
  130. Debug.Log(jsonString);
  131. using (UnityWebRequest unityWebRequest = new UnityWebRequest(url, "POST"))
  132. {
  133. unityWebRequest.SetRequestHeader("Content-Type", "application/json");
  134. unityWebRequest.uploadHandler = new UploadHandlerRaw(bytes);
  135. unityWebRequest.downloadHandler = new DownloadHandlerBuffer();
  136. yield return unityWebRequest.SendWebRequest();
  137. if (unityWebRequest.result != UnityWebRequest.Result.Success)
  138. {
  139. Debug.Log(unityWebRequest.error + "...<color=red>[ER]</color>");
  140. StartCoroutine(RetryUpload());
  141. }
  142. else
  143. {
  144. serverCallbackJson = JsonConvert.DeserializeObject<ServerCallbackJson>(unityWebRequest.downloadHandler.text);
  145. Debug.Log($"{unityWebRequest.downloadHandler.text}");
  146. Debug.Log($"{serverCallbackJson.data.view_url}...<color=green>[OK]</color>");
  147. EventNoticeAll(); // 钩子在此
  148. }
  149. }
  150. yield break;
  151. }
  152. /// <summary>
  153. /// 传不上去硬传
  154. /// </summary>
  155. /// <returns></returns>
  156. private IEnumerator RetryUpload()
  157. {
  158. yield return new WaitForSeconds(retryWaitTime);
  159. UploadData2Cloud();
  160. yield break;
  161. }
  162. // ==================================================
  163. // Json解析类
  164. // 七牛云Token回执
  165. public class TokenJson
  166. {
  167. public int status;
  168. public int code;
  169. public TokenDataJson data;
  170. public string message;
  171. }
  172. public class TokenDataJson
  173. {
  174. public string token;
  175. }
  176. // 七牛云文件上传回执
  177. public class CloudCallbackJson
  178. {
  179. public int code;
  180. public CloudCallbackDataJson data;
  181. public int status;
  182. }
  183. public class CloudCallbackDataJson
  184. {
  185. public string file_name;
  186. public string file_url;
  187. }
  188. // 向服务器发送的json
  189. public class ServerJson
  190. {
  191. public string file_url;
  192. public int app_id;
  193. // public string options;
  194. }
  195. // 服务器回执
  196. public class ServerCallbackJson
  197. {
  198. public int status;
  199. public int code;
  200. public ServerCallbackDataJson data;
  201. }
  202. public class ServerCallbackDataJson
  203. {
  204. public string file_url;
  205. public int app_id;
  206. public string code;
  207. public string view_url;
  208. public string updated_at;
  209. public string created_at;
  210. public int id;
  211. }
  212. }
  213. }