一、上傳和下載圖片
Unity的WWW不但能上傳下載文本形式的數據,還可以上傳下載圖片,不過在傳輸過程中,圖片的信息需要轉為文本格式。
1.在Unity中創建一個RawImage並在WebManager.cs腳本中添加一個Texture2D屬性用於保存圖片信息、一個String屬性存取本地加載的圖片地址、一個RawImage屬性用於顯示上傳的圖片:
string PicturePath = @"file://C:\Users\Administrator\Desktop\vip.jpg"; public RawImage myRaw; public Texture2D m_uploadImage;
2.在WebManager.cs腳本中創建一個加載本地圖片的方法在Awake中初始化加載圖片,加載的圖片與m_uploadImage關聯,后面我們只需要將m_uploadImage這張圖片上傳到服務器即可:
private void Awake() { StartCoroutine(ReadPic()); } IEnumerator ReadPic() { WWW www = new WWW(PicturePath); yield return www; if (www.error != null) { m_info = www.error; yield return null; } m_uploadImage = www.texture; }
3.在WebManager.cs中添加一個上傳方法和一個讀取方法如下:
/// <summary> /// 服務器下載圖片 /// </summary> /// <returns></returns> IEnumerator DownLoadPic() { WWW www = new WWW("http://127.0.0.1:8088/upload/xxx.png"); yield return www; if (www.error != null) { Debug.LogError(www.error); yield return null; } myRaw.texture = www.texture; } /// <summary> /// 圖片上傳服務器 /// </summary> /// <returns></returns> IEnumerator IRequestPic() { WWWForm form = new WWWForm(); form.AddField("folder","upload/"); form.AddBinaryData("Pic", m_uploadImage.EncodeToPNG(),"xxx.png","image/png"); WWW www = new WWW("http://127.0.0.1:8088/index.php", form); yield return www; if (www.error != null) { Debug.LogError(www.error); yield return null; } if (www.isDone) { Debug.LogError("上傳成功"); StartCoroutine(DownLoadPic()); } Debug.LogError(www.text); }
在上傳的這段代碼中,我們使用EncodeToPNG函數將圖片轉出為byte數組,使用WWWForm的方式上傳到Web服務器上,與之前不同的是,這一次上傳的PNG格式的圖片。當上傳完成之后在加載該圖片。
4.在OnGUI中添加上傳和下載代碼並修改原始Rect的參數
private void OnGUI() { GUI.BeginGroup(new Rect(Screen.width * 0.5f - 100,Screen.height * 0.5f -100,500,200),""); GUI.Label(new Rect(10,10,400,30),m_info); if (GUI.Button(new Rect (10,50,150,30),"GetData")) { StartCoroutine(IGetData()); } if (GUI.Button(new Rect(10,80,150,30),"Post Data")) { StartCoroutine(IPostData()); } if (GUI.Button(new Rect(10, 110, 150, 30), "上傳 Image")) { StartCoroutine(IRequestPic()); } if (GUI.Button(new Rect(10, 140, 150, 30), "下載 Image")) { StartCoroutine(DownLoadPic()); } GUI.EndGroup(); }
5.修改index.php代碼
<?php if ( isset($_GET['username']) && isset($_GET['password']) ) { echo 'username is '.$_GET['username'].' and password is '.$_GET['password']; } else if ( isset($_POST['username']) && isset($_POST['password']) ) { echo 'username is '.$_POST['username'].' and password is '.$_POST['password']; } else if( isset($_FILES['Pic'])) { //$_FILES['字段名']['name'] 客戶端文件的原名稱。 //$_FILES['字段名']['type'] 文件的 MIME 類型,需要瀏覽器提供該信息的支持,例如"image/gif"。 //$_FILES['字段名']['size'] 已上傳文件的大小,單位為字節。 //$_FILES['字段名']['tmp_name'] 文件被上傳后在服務端儲存的臨時文件名,一般是系統默認。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函數設置是不起作用的。 //$_FILES['字段名']['error'] 和該文件上傳相關的錯誤代碼。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的說明:(它們在PHP3.0以后成了常量) $folder=$_POST["folder"];//根據表單字段接受文件夾的字符串信息 $fileName=$_FILES["Pic"]["name"];//根據表單字段接收需要保存的文件名字 $tmp=$_FILES["Pic"]["tmp_name"]; $fil=$folder.$fileName; //下面這一段代碼保存數據信息到文本,用來測試提交的字符串信息 $file=fopen("test.txt","a+"); fwrite($file,$folder."+"); fwrite($file,$fileName."+"); fwrite($file,$fil); fclose($file); //判斷當期目錄下的upload目錄是否存在該文件 if(!file_exists($fil)) { //如果upload目錄不存在該文件則將文件上傳到upload目錄下 move_uploaded_file($tmp,$fil); } } ?>
因為在Unity中上傳的是一張圖片,所以我們使用$_FILES來獲得圖片,這是一個PHP數組,其中‘tmp_name’是保存臨時文件的位置,我們訪問數組的這個位置即可獲得圖片。
6.測試如下:
當點擊上傳 Image
二、刪除服務器文件夾與創建服務器文件夾
1.在WebManager.cs中添加一個創建文件夾方法和一個刪除文件夾方法
/// <summary> /// 創建文件夾 /// </summary> /// <param name="FolderName"></param> /// <returns></returns> IEnumerator CreatFolder(string FolderName) { WWWForm form = new WWWForm(); form.AddField("CreateFolderName", FolderName); WWW www = new WWW("http://127.0.0.1:8088/index.php", form); yield return www; if (www.error != null) { m_info = www.error; yield return null; } m_info = www.text; if (www.isDone) { Debug.Log("創建文件夾完成"); } Debug.LogError(www.text); } /// <summary> /// 刪除文件夾 /// </summary> /// <param name="FolderName"></param> /// <returns></returns> IEnumerator DelFolder(string FolderName) { WWWForm form = new WWWForm(); form.AddField("DeleteFolderName", FolderName); WWW www = new WWW("http://127.0.0.1:8088/index.php", form); yield return www; if (www.error != null) { m_info = www.error; yield return null; } m_info = www.text; if (www.isDone) { Debug.Log("刪除文件夾完成"); } Debug.LogError(www.text); }
2.在OnGUI函數中添加如下代碼
if (GUI.Button(new Rect(150, 110, 150, 30), "服務器創建文件夾")) { StartCoroutine(CreatFolder("NewFolder")); } if (GUI.Button(new Rect(150, 140, 150, 30), "服務器刪除文件夾")) { StartCoroutine(DelFolder("NewFolder")); }
3.修改index.php代碼
<?php if ( isset($_GET['username']) && isset($_GET['password']) ) { echo 'username is '.$_GET['username'].' and password is '.$_GET['password']; } else if ( isset($_POST['username']) && isset($_POST['password']) ) { echo 'username is '.$_POST['username'].' and password is '.$_POST['password']; } else if( isset($_FILES['Pic'])) { //$_FILES['字段名']['name'] 客戶端文件的原名稱。 //$_FILES['字段名']['type'] 文件的 MIME 類型,需要瀏覽器提供該信息的支持,例如"image/gif"。 //$_FILES['字段名']['size'] 已上傳文件的大小,單位為字節。 //$_FILES['字段名']['tmp_name'] 文件被上傳后在服務端儲存的臨時文件名,一般是系統默認。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函數設置是不起作用的。 //$_FILES['字段名']['error'] 和該文件上傳相關的錯誤代碼。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的說明:(它們在PHP3.0以后成了常量) $folder=$_POST["folder"];//根據表單字段接受文件夾的字符串信息 $fileName=$_FILES["Pic"]["name"];//根據表單字段接收需要保存的文件名字 $tmp=$_FILES["Pic"]["tmp_name"]; $fil=$folder.$fileName; //下面這一段代碼保存數據信息到文本,用來測試提交的字符串信息 $file=fopen("test.txt","a+"); fwrite($file,$folder."+"); fwrite($file,$fileName."+"); fwrite($file,$fil); fclose($file); //判斷當期目錄下的upload目錄是否存在該文件 if(!file_exists($fil)) { //如果upload目錄不存在該文件則將文件上傳到upload目錄下 move_uploaded_file($tmp,$fil); } } else if( isset($_POST['CreateFolderName'])) { $myFile = $_POST["CreateFolderName"];//獲取要創建的文件夾名字 //文件存儲路徑 if(!file_exists($myFile)) { //判斷文件夾是否存在 //42行 mkdir($myFile,0777);//創建文件夾,並指定權限為0777才可以上傳文件保存進去 } } else if( isset($_POST['DeleteFolderName'])) { $myFile = $_POST["DeleteFolderName"]; //調用函數,傳入路徑 deleteDir($myFile); } ?> <?php //調用刪除方法 function deleteDir($dir) { if (!$handle = @opendir($dir))//判斷當前文件夾是否為根目錄 { return false; } while (false !== ($file = readdir($handle)))//循環遍歷當前文件夾 { if ($file !== "." && $file !== "..") { //排除當前目錄與父級目錄 $file = $dir . '/' . $file; if (is_dir($file)) { deleteDir($file);//刪除當前文件夾中的文件 } else { @unlink($file); } } } @rmdir($dir);//刪除文件夾 } ?>