為了實現本地存檔的雲服務化。搞了一個雲存檔的機制。順帶把測試中發生的各種報錯日志也發送到服務端進行后續處理和查錯。
Unity上傳文件
public IEnumerator UploadLog() { string filesPath = Application.persistentDataPath + "/log.txt"; UnityWebRequest files = new UnityWebRequest(); WWWForm form = new WWWForm(); files = UnityWebRequest.Get(filesPath); yield return files.SendWebRequest(); form.AddBinaryData("files", files.downloadHandler.data, "client_log.log"); long fileLen = files.downloadHandler.data.Length;
//限制文件大小 if (fileLen < 5120000) { Debug.Log("file len: " + fileLen); UnityWebRequest req = UnityWebRequest.Post("http://xxxxxxx", form); yield return req.SendWebRequest(); if (req.isHttpError || req.isNetworkError) Debug.LogError(req.error); else Debug.Log("Uploaded log Successfully"); } else { Debug.LogError("log文件太長了 " + fileLen); } }
對應的服務端接收和處理代碼
public function uploadLog() { $name = $_FILES['files']['name']; $size = $_FILES["files"]["size"]; $nameArray = explode(".",$name); $extension = end($nameArray); // 獲取文件后綴名 if ( ($size < 5120000) && $extension =="log")// 小於 5M 后綴名log { if ($_FILES["files"]["error"] > 0) { echo "錯誤:: " . $_FILES["files"]["error"] . "<br>"; return; } // else // { // echo "上傳文件名: " . $_FILES["files"]["name"] . "<br>"; // echo "文件類型: " . $_FILES["files"]["type"] . "<br>"; // echo "文件大小: " . ($_FILES["files"]["size"] / 1024) . " kB<br>"; // echo "文件臨時存儲的位置: " . $_FILES["files"]["tmp_name"]; // } } else { echo "非法的文件"; return ; } $time = date("Y_m_d"); $userid = input('post.userid'); if($userid==null) { echo "userId error!"; return; } $uploadError = false; $filepath = APP_PATH . "../../UpLog/" .$time; if(!file_exists($filepath)) $mkdir_file_dir = mkdir($filepath,0777,true); //獲取到標題,在最終的目錄下面建立一個文件夾用來存放分類指 $tmpFilePath = $_FILES['files']['tmp_name']; if ($tmpFilePath != "") { $newFilePath = $filepath.'/'.$userid."_".$_FILES['files']['name']; if (!move_uploaded_file($tmpFilePath, $newFilePath)) $uploadError = true; } if ($uploadError) echo "Upload Error"; else echo "Uploaded Successfully"; }
如上兩個方法配對。即可完成客戶端文件上傳服務端按照日期和自定目錄保存的功能。
相應的如果需要拉取文件只要配置好資源目錄和身份驗證模塊。
files = UnityWebRequest.Get(filesPath);
從指定的位置獲取即可。