Unity向Web服務器上傳和下載圖片


一、上傳和下載圖片

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);//刪除文件夾
}
?>


免責聲明!

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



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