Unity向Web服务器上传和下载图片
一、上传和下载图片
Unity的WWW不但能上传下载文本形式的数据,还可以上传下载图片,不过在传输过程中,图片的信息需要转为文本格式。
1.在Unity中创建一个RawImage并在WebManager.cs脚本中添加一个Texture2D属性用于保存图片信息、一个String属性存取本地加载的图片地址、一个RawImage属性用于显示上传的图片:
1 2 3 4 5 | string PicturePath = @"file://C:\Users\Administrator\Desktop\vip.jpg" ; public RawImage myRaw; public Texture2D m_uploadImage; |
2.在WebManager.cs脚本中创建一个加载本地图片的方法在Awake中初始化加载图片,加载的图片与m_uploadImage关联,后面我们只需要将m_uploadImage这张图片上传到服务器即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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中添加一个上传方法和一个读取方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | /// <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的参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <?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中添加一个创建文件夹方法和一个删除文件夹方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | /// <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函数中添加如下代码
1 2 3 4 5 6 7 8 9 | 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代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | <?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); //删除文件夹 } ?> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)