using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using System.Text;
using Newtonsoft.Json;
using UnityEngine.Networking;
using System.IO;
using System;
using ToneTuneToolkit.Common;
///
/// 对乔哥法宝
///
public class Upload2OYManager : SingletonMaster
{
public static UnityAction OnUploadFinishedBackTexture;
public static UnityAction OnUploadFinishedBackString;
private int appID = 78;
private float retryWaitTime = 30f; // 重新上传尝试间隔
[Header("Token")]
[SerializeField] private TokenCallbackJson tokenJson = new TokenCallbackJson();
[Header("Cloud")]
[SerializeField] private CloudCallbackJson cloudCallbackJson = new CloudCallbackJson();
[Header("Server")]
[SerializeField] private ServerJson serverJson = new ServerJson();
[SerializeField] private ServerCallbackJson serverCallbackJson = new ServerCallbackJson();
private const string cloudTokenURL = @"https://h5.skyelook.com/api/qiniu/getAccessToken";
private const string qiniuURL = @"https://upload.qiniup.com";
private const string cloudURL = @"https://h5.skyelook.com/api/attachments";
// ==================================================
#region Step 00 // 完善文件信息
[Space]
[SerializeField] private string fileName;
[SerializeField] private string filePath;
public void UpdateFileInfo(string name, string path)
{
fileName = name;
filePath = path;
return;
}
#endregion
// ==================================================
#region Step 01 // 获取Token
public void UploadData2Net() => StartCoroutine(nameof(GetTokenFromCloud));
private IEnumerator GetTokenFromCloud()
{
using (UnityWebRequest unityWebRequest = UnityWebRequest.Get(cloudTokenURL))
{
yield return unityWebRequest.SendWebRequest();
if (unityWebRequest.result != UnityWebRequest.Result.Success)
{
Debug.Log($"[U2OYM] {unityWebRequest.error}");
StartCoroutine(nameof(RetryUpload));
}
else
{
tokenJson = JsonConvert.DeserializeObject(unityWebRequest.downloadHandler.text);
Debug.Log($"[U2OYM] Get token sucessed: {tokenJson.data.token}");
StartCoroutine(nameof(PoseFile2Cloud)); // 下一步
}
}
yield break;
}
#endregion
// ==================================================
#region Step 02 // 上传文件到七牛云
private IEnumerator PoseFile2Cloud()
{
byte[] bytes = File.ReadAllBytes(filePath); // 文件转流
WWWForm wwwForm = new WWWForm();
wwwForm.AddField("token", tokenJson.data.token);
wwwForm.AddBinaryData("file", bytes, fileName);
using (UnityWebRequest unityWebRequest = UnityWebRequest.Post(qiniuURL, wwwForm))
{
yield return unityWebRequest.SendWebRequest();
if (unityWebRequest.result != UnityWebRequest.Result.Success)
{
Debug.Log($"[U2OYM] {unityWebRequest.error}");
StartCoroutine(nameof(RetryUpload));
}
else
{
cloudCallbackJson = JsonConvert.DeserializeObject(unityWebRequest.downloadHandler.text);
Debug.Log($"[U2OYM] Upload sucessed: {cloudCallbackJson.data.file_url}");
StartCoroutine(SaveFile2Server()); // 下一步
}
}
yield break;
}
#endregion
// ==================================================
#region Step 03 // 七牛云返回数据传至服务器
private IEnumerator SaveFile2Server()
{
serverJson.file_url = cloudCallbackJson.data.file_url;
serverJson.app_id = appID;
string jsonString = JsonConvert.SerializeObject(serverJson);
byte[] bytes = Encoding.Default.GetBytes(jsonString);
using (UnityWebRequest unityWebRequest = new UnityWebRequest(cloudURL, "POST"))
{
unityWebRequest.SetRequestHeader("Content-Type", "application/json");
unityWebRequest.uploadHandler = new UploadHandlerRaw(bytes);
unityWebRequest.downloadHandler = new DownloadHandlerBuffer();
yield return unityWebRequest.SendWebRequest();
if (unityWebRequest.result != UnityWebRequest.Result.Success)
{
Debug.Log($"[U2OYM] {unityWebRequest.error}");
StartCoroutine(nameof(RetryUpload));
}
else
{
serverCallbackJson = JsonConvert.DeserializeObject(unityWebRequest.downloadHandler.text);
Debug.Log($"[U2OYM] {serverCallbackJson.data.view_url}");
// 返回链接
if (OnUploadFinishedBackString != null)
{
OnUploadFinishedBackString(serverCallbackJson.data.view_url);
}
// 组装
sunCodeURL = $"https://h5.skyelook.com/api/wechat/getQrcodeApp/{serverCallbackJson.data.code}/wx039a4c76d8788bb0/?env=trial"; // ?env=trial // 额外添加?
StartCoroutine(nameof(GetSunCode4Server)); // 下一步搞图
}
}
yield break;
}
#endregion
// ==================================================
#region Step 04 // 从服务器上获取码
[SerializeField] private string sunCodeURL;
[SerializeField] private Texture2D finalSunCode;
private IEnumerator GetSunCode4Server()
{
using (UnityWebRequest unityWebRequest = UnityWebRequestTexture.GetTexture(sunCodeURL)) // new UnityWebRequest(sunCodeURL, "GET"))
{
yield return unityWebRequest.SendWebRequest();
if (unityWebRequest.result != UnityWebRequest.Result.Success)
{
Debug.Log("[UM] " + unityWebRequest.error);
}
else
{
// td = new Texture2D(600, 600);
// td.LoadImage(unityWebRequest.tex);
finalSunCode = ((DownloadHandlerTexture)unityWebRequest.downloadHandler).texture;
// 返回图
if (OnUploadFinishedBackTexture != null)
{
OnUploadFinishedBackTexture(((DownloadHandlerTexture)unityWebRequest.downloadHandler).texture);
}
}
}
yield break;
}
#endregion
// ==================================================
///
/// 传不上去硬传
///
///
private IEnumerator RetryUpload()
{
yield return new WaitForSeconds(retryWaitTime);
PoseFile2Cloud();
yield break;
}
// ==================================================
// Json解析类
// 七牛云Token回执
[Serializable]
public class TokenCallbackJson
{
public int status;
public int code;
public TokenDataJson data;
public string message;
}
[Serializable]
public class TokenDataJson
{
public string token;
}
// 七牛云文件上传回执
[Serializable]
public class CloudCallbackJson
{
public int code;
public CloudCallbackDataJson data;
public int status;
}
[Serializable]
public class CloudCallbackDataJson
{
public string file_name;
public string file_url;
}
// 向服务器发送的json
[Serializable]
public class ServerJson
{
public string file_url;
public int app_id;
// public string options;
}
[Serializable]
public class ServerCallbackJson
{
public int status;
public int code;
public ServerCallbackDataJson data;
}
[Serializable]
public class ServerCallbackDataJson
{
public string file_url;
public int app_id;
public string code;
public string view_url;
public string updated_at;
public string created_at;
public int id;
}
}