unity+上傳數據到服務器(string、對象、文件)


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)));//打印保存文件



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM