使用UnityWebRequest向服务端发送本地存档和日志
为了实现本地存档的云服务化。搞了一个云存档的机制。顺带把测试中发生的各种报错日志也发送到服务端进行后续处理和查错。
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);
从指定的位置获取即可。