1.string方式
首先去下載LitJson.dll,放在Plugins 目錄下;
LitJson可以從下面的地址獲得:http://download.csdn.net/detail/h570768995/9373927
然后我們定義json格式,比如我們需要如下格式:
{"intValue":345,"longValue":345679876,"stringValue":"xiaoxian","byteValue":'v',"doubleValue":345.87}
public class MessageJson { public int intValue; public long longValue; public string stringValue; public byte byteValue; public double doubleValue; }
然后在方法中聲明該類,接着將其映射為Json格式:
MessageJson msgJson = new MessageJson(); msgJson.intValue = 20; msgJson.longValue = 10000000000000L; msgJson.stringValue = "chenhao"; msgJson.byteValue = (byte)msgJson.intValue; msgJson.doubleValue = 3153456.125651; string jsonDataPost = JsonMapper.ToJson(msgJson);
如此將該數據傳送出去:
WWW www = new WWW("http://192.168.1.192:18080/test",Encoding.UTF8.GetBytes(jsonDataPost));
接着等待數據,並可以打印出來:
while(!www.isDone) { Debug.Log("wait"); } yield return www; if(www.error!=null) { Debug.LogError(www.error); } else { Debug.Log(www.text); //取數據1 MessageJson msgJsonRecieve = JsonMapper.ToObject<MessageJson>(www.text); Debug.Log(msgJsonRecieve.intValue); Debug.Log(msgJsonRecieve.longValue); Debug.Log(msgJsonRecieve.stringValue); Debug.Log(msgJsonRecieve.byteValue); Debug.Log(msgJsonRecieve.doubleValue); //取數據2 JsonData jsonData = JsonMapper.ToObject(www.text); if (jsonData["stringValue"] != null) { Debug.Log(jsonData["stringValue"].ToString()); }
JsonMapper映射可以無視排序問題,它只看“鍵值對”中的鍵。
/// <summary> /// 發送整體string,由於數據量比較大,目前55M,所以棄用 /// </summary> /// <returns></returns> IEnumerator UpLoadData() { if (OfflineDevicesDic != null && OfflineDevicesDic.Count != 0) { //foreach(var item in OfflineDevicesDic.Values) //{ // foreach (var item1 in item.offlinePhotos) // { // Debug.LogError(item1.stepId+"______"+item1.base64str); // } //} //總體信息 offlineGameStatusJson = new OfflineGameStatus(); offlineGameStatusJson.sceneId = ARGameJsonDateHandle.ARGameJsonDateHandleInstance.CurrentTasks.sceneId; offlineGameStatusJson.staffNumber = ARGlobalData.SuccessScanUserID; offlineGameStatusJson.TotalScore = ARScroingTimeManager.ARScroingTimeManagerInstance.TotalPointTemp; offlineGameStatusJson.SkipScanScore = ARScroingModuleManager.ARScroingModuleManagerInstance.SkipScanGrade; offlineGameStatusJson.TotalTime = ARScroingTimeManager.ARScroingTimeManagerInstance.TotalScroingTime; offlineGameStatusJson.SkipScanNumber = ARScroingModuleManager.ARScroingModuleManagerInstance.SkipScanNum; offlineGameStatusJson.offlineDevices = new OfflineDevices[OfflineDevicesDic.Values.Count]; OfflineDevicesDic.Values.CopyTo(offlineGameStatusJson.offlineDevices, 0);//將OfflineDevicesDic.Values復制到(offlineGameStatusJson.offlineDevices數組中,起始位置為0) // OfflineUpLoadJson = JsonMapper.ToJson(offlineGameStatusJson);//保存本地中文亂碼 // string JsonDataPost = JsonUtility.ToJson(offlineGameStatusJson);//保存本地中文不亂碼 string JsonDataPost = JsonMapper.ToJson(offlineGameStatusJson);//保存本地中文不亂碼 // string savePath1 = Application.persistentDataPath + "/" + name + "_" + ARGlobalData.SuccessScanUserID + ".txt"; ////File.WriteAllText(savePath, LocalJson); // strTest.Add(JsonDataPost); // File.WriteAllLines(savePath1, (string[])strTest.ToArray(typeof(string))); WWW www = new WWW(ARGlobalData.NewConfigurePathStr + "/TPlant-inspect/api/inspect/uploadInspectionResult", Encoding.UTF8.GetBytes(JsonDataPost)); while (!www.isDone) { Debug.Log("wait"); } yield return www; if (www.error != null) { Debug.LogError(www.error); IsOfflineUploadDataSuccess = false; } else { Debug.LogError(www.text); //取數據1 OfflineGameStatus OfflineGameStatusref = JsonMapper.ToObject<OfflineGameStatus>(www.text); Debug.LogError(OfflineGameStatusref.staffNumber); IsOfflineUploadDataSuccess = true; //取數據2 //JsonData jsondata = JsonMapper.ToObject(www.text); //if(jsondata["sceneId"]!=null) //{ // Debug.LogError(jsondata["sceneId"].ToString()); //} } } }
注:https://blog.csdn.net/h570768995/article/details/50386935
2.對象(之前按步驟上傳的方法PA)
/// <summary> /// WWWForm上傳json,和單步上傳相同,由於上傳到服務器的數據會成一堆,后台不好解析,暫時棄用 /// </summary> public void NewUpLoadData() { if (OfflineDevicesDic != null && OfflineDevicesDic.Count != 0) { WWWForm inspectResult = new WWWForm(); inspectResult.AddField("sceneId", ARGameJsonDateHandle.ARGameJsonDateHandleInstance.CurrentTasks.sceneId); inspectResult.AddField("staffNumber", ARGlobalData.SuccessScanUserID); inspectResult.AddField("TotalScore", ARScroingTimeManager.ARScroingTimeManagerInstance.TotalPointTemp); // inspectResult.AddField("SkipScanScore", ARGlobalData.SkipScanScore);//2021.10.15注釋 inspectResult.AddField("SkipScanScore", ARScroingModuleManager.ARScroingModuleManagerInstance.SkipScanGrade); inspectResult.AddField("TotalTime", ARScroingTimeManager.ARScroingTimeManagerInstance.TotalScroingTime); inspectResult.AddField("SkipScanNumber", ARScroingModuleManager.ARScroingModuleManagerInstance.SkipScanNum); foreach (var item in OfflineDevicesDic.Values) { inspectResult.AddField("taskId",item.taskId); inspectResult.AddField("actionId", item.actionId); inspectResult.AddField("deviceId", item.deviceId); if (item.offlineSteps.Length > 0 && item.offlineSteps != null) { foreach (var item1 in item.offlineSteps) { inspectResult.AddField("stepId", item1.stepId); inspectResult.AddField("opTime", item1.opTime); inspectResult.AddField("opResult", item1.opResult); } } inspectResult.AddField("SingleDeviceCheckScore", item.taskId); if(item.offlinePhotos.Length>0&& item.offlinePhotos!=null) { foreach (var item2 in item.offlinePhotos) { Debug.LogError(item2.base64str); inspectResult.AddField("stepId", item2.stepId); inspectResult.AddField("base64str", "1111"); } } } // Debug.LogError("inspectResult: "+ inspectResult.data.ToString()); OnSendPost(ARGlobalData.NewConfigurePathStr + "/TPlant-inspect/api/inspect/uploadInspectionResult", inspectResult); } }
public void OnSendPost(string url, WWWForm wForm) { StartCoroutine(SendPost(url, wForm)); } IEnumerator SendPost(string url, WWWForm wForm) { WWW postDate = new WWW(url, wForm); // Debug.LogError(postDate.text); //Debug.LogError(postDate); yield return postDate; if (postDate.error != null) { Debug.LogError(postDate.error); } else { Debug.Log(postDate.text); } }
3.Unity使用UnityWebRequest上傳文件到服務器的簡單實現流程
前言
我在以前的項目中寫過有關上傳圖片到服務器的功能,但是沒有寫過上傳其他類型的文件到服務器上的功能。今天為了實現一個上傳gif圖片的功能,我在網上查找資料,找到了一種使用UnityWebRequest上傳文件的方法。這個方法真是太有用處了,可以說是什么文件都通用,於是我在這里趕緊記錄一下,方便以后使用。
實現步驟
1.實現步驟很簡單,以下是我自己很據網上的資料寫的腳本,完成后將此腳本掛載到場景中的物體上,代碼如下所示:
using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.Networking; public class UpGifManager : MonoBehaviour { string url = "服務器鏈接,服務端會提供!"; /// <summary> /// 上傳到服務器 /// </summary> public void ToShengGif() { StartCoroutine(UploadVideo()); } // 上傳視頻 IEnumerator UploadVideo() { byte[] gifByte = File.ReadAllBytes("E:/Work/ffepgtest/gif/a.gif"); WWWForm form = new WWWForm(); //根據自己長傳的文件修改格式 form.AddBinaryData("file", gifByte, "myGif.mp4", "a/gif"); using (UnityWebRequest www = UnityWebRequest.Post(url, form)) { yield return www.SendWebRequest(); if (www.isNetworkError || www.isHttpError) { Debug.Log(www.error); } else { string text = www.downloadHandler.text; Debug.Log("服務器返回值" + text);//正確打印服務器返回值 } } } }
發送成功后會有提示。
(注:發送Json方式也是一樣將地址改變就行.json)
/// <summary> /// 直接上傳整個Json文件到服務器,正式使用 /// </summary> /// <returns></returns> IEnumerator NewNewUpLoad() { byte[] jsonByte = File.ReadAllBytes(Application.persistentDataPath + "/" + "OfflineData" + "_" + ARGlobalData.SuccessScanUserID + ".json"); WWWForm form = new WWWForm(); //根據自己長傳的文件修改格式 form.AddBinaryData("file", jsonByte, "stepNoPhoto.json", "stepNoPhoto/json"); using (UnityWebRequest www = UnityWebRequest.Post(ARGlobalData.NewConfigurePathStr + "/TPlant-inspect/api/inspect/importData", form)) { yield return www.SendWebRequest(); if (www.isNetworkError || www.isHttpError) { Debug.Log("服務器上傳失敗" + www.error); IsOfflineUploadDataSuccess = false; } else { Debug.Log("成功"); //string text = www.downloadHandler.text; IsOfflineUploadDataSuccess = true; //Debug.Log("服務器返回值" + text);//正確打印服務器返回值 } } }
保存Json到本地
public class OfflineGameStatus { public OfflineGameStatus(){}; public int sceneId;//場景id public string staffNumber;//巡檢 員工號 public OfflineDevices[] off1ineDevices; public int TotalPoint;// 總時間分數 public int SkipScanGrade;//跳過掃描分數 } [Serializable] public class OfflineDevices public int taskId;//任務id public int actionId;//動作id public int deviceId; public OfflineSteps offl ineSteps; public int SingleDeviceCheckTime;// 單項巡檢時間 public OfflinePhotos [] offlinePhotos;//設 備圖片信息 [Serializable] public class OfflineSteps { public int stepId; public string opTime;//步 驟巡檢時間 public string opResult;//步驟巡檢結果 } [Serializable] public class offlinePhotos { public int stepId; public string base64str;//圖片信息 }
/// <summary> /// 每個設備檢查完成上傳一次數據(本地保存) /// </summary> /// <param name="name"></param> public void OnOfflineUploadData(string name) { //2021.10.19改為最后巡檢完成,在上傳所有數據 if (ARGameManagerLogic.ARGameManagerLogicInstance.nextStepID == -1)//一個設備檢查完成 { //StartCoroutine(UpLoadData()); // NewUpLoadData(); if (OfflineDevicesDic != null && OfflineDevicesDic.Count != 0) { //總體信息 offlineGameStatus = new OfflineGameStatus(); offlineGameStatus.sceneId = ARGameJsonDateHandle.ARGameJsonDateHandleInstance.CurrentTasks.sceneId; offlineGameStatus.staffNumber = ARGlobalData.SuccessScanUserID; offlineGameStatus.TotalScore = ARScroingTimeManager.ARScroingTimeManagerInstance.TotalPointTemp; //offlineGameStatus.SkipScanScore = ARGlobalData.SkipScanScore;///2021.10.15注釋 ARScroingModuleManager.ARScroingModuleManagerInstance.SkipScanGrade = ARScroingModuleManager.ARScroingModuleManagerInstance.OnSkipScanningScroing(); offlineGameStatus.SkipScanScore = ARScroingModuleManager.ARScroingModuleManagerInstance.SkipScanGrade; offlineGameStatus.TotalTime = ARScroingTimeManager.ARScroingTimeManagerInstance.TotalScroingTime; offlineGameStatus.SkipScanNumber = ARScroingModuleManager.ARScroingModuleManagerInstance.SkipScanNum; offlineGameStatus.inspectTaskId = ARGlobalData.inspectTaskId; offlineGameStatus.offlineDevices = new OfflineDevices[OfflineDevicesDic.Values.Count]; OfflineDevicesDic.Values.CopyTo(offlineGameStatus.offlineDevices, 0);//將OfflineDevicesDic.Values復制到(offlineGameStatus.offlineDevices數組中,起始位置為0) Debug.Log(offlineGameStatus.inspectTaskId); // OfflineUpLoadJson = JsonMapper.ToJson(offlineGameStatus);//保存本地中文亂碼 string LocalJson = JsonUtility.ToJson(offlineGameStatus);//保存本地中文不亂碼 string savePath1 = Application.persistentDataPath + "/" + name + "_" + ARGlobalData.SuccessScanUserID + ".json"; ////File.WriteAllText(savePath, LocalJson); strTest.Clear(); strTest.Add(LocalJson); File.WriteAllLines(savePath1, (string[])strTest.ToArray(typeof(string))); } // Debug.Log("請求1"); // StartCoroutine(NewNewUpLoad());//2021.10.19暫時隱藏改為最后巡檢完成,在上傳所有數據 // AROfflineUploadData.AROfflineUploadDataInstance.OnFormalOfflineUploadData("OfflineData"); } }
//總體信息 offlineGameStatus = new OfflineGameStatus() ; offlineGameStatus. sceneId = 0; offlineGameStatus. TotalPoint = 100 ; offlineGameStatus. SkipScanGrade = 100; offlineGameStatus. offlineDevices = new OfflineDevices [OfflineDevicesDic.Values.Count]; OfflineDevicesDic.Values.CopyTo(offlineGameStatus. offlineDevices, 0) ;//將OfflineDevicesDic.Vaue復制到((offlineGameStatus. offlineDevices數組中,起始位置為0) 0fflineUpLoadJson = JsonMapper. ToJson (offlineGameStatus) ;//保存本地中文亂碼 string LocalJson = JsonUtility. ToJson (offlineGameStatus) ;//保存本地中文不亂碼 string savePath1 = Application. persi stentDataPath +”/” + name +””+ ARGlobalDat////File. WriteAllText (savePath, LocalJson) ; strTest. Clear() ; strTest. Add (LocalJson) ; File. WriteAllLines (savePath1, (string[]) strTest. ToArray (typeof (string)));//打印保存文件