Unity向Web服务器上传和下载图片

Unity向Web服务器上传和下载图片

  • 如果本片有看不懂的请查看我上篇文章:[Unity与Web服务器Post,Get](https://blog.csdn.net/qq_42194657/article/details/103031573)
  • 一、上传和下载图片
    • 1.在Unity中创建一个RawImage并在WebManager.cs脚本中添加一个Texture2D属性用于保存图片信息、一个String属性存取本地加载的图片地址、一个RawImage属性用于显示上传的图片:
    • 2.在WebManager.cs脚本中创建一个加载本地图片的方法在Awake中初始化加载图片,加载的图片与m_uploadImage关联,后面我们只需要将m_uploadImage这张图片上传到服务器即可:
    • 3.在WebManager.cs中添加一个上传方法和一个读取方法如下:
    • 4.在OnGUI中添加上传和下载代码并修改原始Rect的参数
    • 5.修改index.php代码
    • 6.测试如下:
  • 二、删除服务器文件夹与创建服务器文件夹
    • 1.在WebManager.cs中添加一个创建文件夹方法和一个删除文件夹方法
    • 2.在OnGUI函数中添加如下代码
    • 3.修改index.php代码

如果本片有看不懂的请查看我上篇文章:Unity与Web服务器Post,Get

一、上传和下载图片

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模式识别与机器学习-特征选择和提取

模式识别与机器学习-特征选择和提取 特征选择一些距离测度公式独立特征的选择准则一般特征的散布矩阵准则 离散K-L变换 谨以此博客作为复习期间的记录。 常见分类问题的流程&#xff0c;数据预处理和特征选择提取时机器学习环节中最重要的两个流程。这两个环节直接决定了最终性…

mac电脑系统性能检测:Geekbench 6最新 for mac

Geekbench 6是一款跨平台的性能测试软件&#xff0c;旨在全面衡量电脑在不同任务和应用程序中的性能。它适用于Windows、macOS、Linux等操作系统&#xff0c;以及移动设备如Android和iOS。 Geekbench 6主要特点包括&#xff1a; 全面覆盖各种性能测试领域&#xff0c;包括CPU…

CTF-PWN-栈溢出-中级ROP-【BROP-1】

文章目录 BROP(Blind ROP)攻击条件攻击路线三种gadget函数参数构造利用PLT构造rdx的参数的gadget找输出函数的plt输出二进制文件内容利用plt表中存在跳转到got表中相应的地址 BROP(Blind ROP) 即没有得到源码或者可执行程序文件的情况的文件下&#xff0c;只有一个提供的功能端…

C++学习实践(一)高频面试问题总结(附详细答案)

文章目录 一、基础常见面试题1、数组和链表区别2、深拷贝和浅拷贝相关问题的区别3、a和a区别4、c内存模型5、四种强制转换和应用场景 二、指针相关1、指针和引用的区别2、函数指针和指针函数3、传指针、引用和值4、常量指针和指针常量5、野指针6、智能指针的用法 三、关键字作用…

mySQL事务与存储引擎

目录 mySQL事务 1.事务的概念 2.事务的ACID特点 3.多客户端同时访问一个表时&#xff0c;出现的一致性问题 4.事务的隔离级别 5.事务的隔离级别作用范围 查询全局事务隔离级别 设置全局事务隔离级别 ​编辑查询会话事务隔离级别 设置会话事务隔离级别 6.事务控制语句…

这一次,我准备了 20节 PyTorch 中文课程

对于刚接触深度学习的小白来说&#xff0c;PyTorch 是必会的框架。 只是&#xff0c;很多小伙伴还没来得及开启学习之路&#xff0c;一个最重要的问题就摆在了面前&#xff1a; PyTorch&#xff0c;该怎么学呢&#xff1f; 很多同学会自己在网上找资料&#xff0c;不仅耗费时间…

如何使用IIS代理iServeriPortal

刘大 这里写目录标题 前言1.IIS使用http协议&#xff0c;iServer&iPortal使用http协议具体操作1.1 开启IIS管理器&#xff0c;并安装APR组件和url重写组件1.3 启用代理1.4 添加URL重写规则1.4.1 设置保留原始主机标头1.4.2 修改注册表1.5 iPortal的额外配置1.5.1 增加新的入…

使用防火墙是否可以应对DDoS攻击?

很多游戏行业公司对网络安全不够了解&#xff0c;觉得装个防火墙就可以万事大吉了。实际上使用防火墙确实是解决DDoS攻击问题的一种有效方法&#xff0c;一些更先进的防火墙还可以采用其他防御措施&#xff0c;例如:深度包检测、行为分析、人工智能等&#xff0c;来识别和防御各…

Vi文本编辑器如何使用,这里有详细步骤

Vi是一个强大的文本编辑器&#xff0c;包含在大多数Linux系统中&#xff0c;甚至是嵌入式系统中。有时&#xff0c;你必须在不包括更友好的文本编辑器的系统上编辑文本文件&#xff0c;因此了解Vi是至关重要的。 与Nano不同&#xff0c;Nano是一款易于使用的终端文本编辑器&am…

Shell 脚本应用(四)

正则表达式概述 正则表达式又称正规表达式&#xff0c;常规表达式。在代码中常简写为regex&#xff0c;regexp 或RE.正则表达式 是使用单个字符串来描述&#xff0c;匹配一系列符合某个句法规则的字符串&#xff0c;简单来说&#xff0c;是一种匹配字符串 的方法&#xff0c;通…

JVM入门到入土-Java虚拟机寄存器指令集与栈指令集

JVM入门到入土-Java虚拟机寄存器指令集与栈指令集 HotSpot虚拟机中的任何操作都需要入栈和出栈的步骤。 由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的。不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器的。优点是跨平台&#xff0c;指令集小&#x…

PyCharm安装PyQt5一系列工具

目录 目录 一、安装IDE 二、安装Pycharm 三、Pycharm内安装一系列工具 1.新建一个项目 2.点击左上角File-Setting-点击加号 3.添加环境变量 4.配置qtdesigner,pyuic,pyrcc 三、用Pyinstaller打包成exe&#xff08;简单版&#xff09; 四、我的解释器装在了中文路径&a…

如何分析信号的频率信息?

1 简介 当信号的频率信息是已知的&#xff0c;或者近似已知的&#xff0c;则采样频率容易选择&#xff0c;选择最大采样频率的2倍以上(奈奎斯特采样)。 这里&#xff0c;将讨论信号频率未知的情况。尤其是&#xff0c;考虑如何避免混叠错误。 2 低通滤波(反混叠) 去除混叠错…

二、基于图像和结构化数据多模态融合的回归预测网络【框图讲解+源码】

整理读研期间做的项目与日常小实验 本篇未完待续…代码部分整理后补充 0. 背景 实验室有一些材料的SEM&#xff08;扫描电镜&#xff09;图像、也有对应的组分信息&#xff08;结构化数据&#xff0c;包含类别特征和连续的数值特征&#xff09;&#xff0c;以及对应的力学性能…

WEB 3D技术 three.js带着大家简单在文档上过一下集合体 并理解如何在文档中调试参数

前面讲了 自己创建集合体 顶点分组 但是这样其实挺麻烦的 three.js 其实已经给我们封装好了 官网直接搜索 geometry 这边这个立方体 应该算是我们用的最多的 这里 这个就是通过三个参数设置 它们分别对应 高度 宽度 厚度 拉下来 我们看到 其实他有六个参数 前面的 x y z三个…

有什么好用的C/C++源代码混淆工具?

​ 有什么好用的C/C源代码混淆工具&#xff1f; 开始使用ipaguard 前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术&#xff0c;可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP进行完整性保护&#xff0c;防止应用…

sqlmap各个命令的解释及其基本用法

各个命令的用法 -h,--help Show basic help message and exit(显示基本帮助消息并退出) -hh Show advanced help message and exit&#xff08;显示高级帮助信息并退出&#xff09; --version Show programs version number and exit&#xff08;显示程序的版本…

力扣刷题记录(18)LeetCode:474、518、377、322

目录 474. 一和零 518. 零钱兑换 II 377. 组合总和 Ⅳ 322. 零钱兑换 总结&#xff1a; 474. 一和零 这道题和前面的思路一样&#xff0c;就是需要将背包扩展到二维。 class Solution { public:int findMaxForm(vector<string>& strs, int m, int n) {vector&l…

C语言结构体内存对齐

文章目录 一、结构体内存对齐问题二、查看结构体成员起始位置三、设置内存对齐方式 一、结构体内存对齐问题 如下的info_s结构体类型&#xff0c;包含一个int型成员age, 一个char型成员gender, 一个int型成员id。 单从数据成员的大小进行分析&#xff0c;整个结构体的大小应为…

输入两个时间,判断时间是否为非工作日,并且是日期否为同一天。是的话返回true,否返回false

工作遇到这么一个逻辑&#xff0c;前端回传两个时间&#xff08;必须是两个那一种&#xff09;。然后&#xff0c;我后端需要判断这两个时间是否为同一天&#xff0c;并且这个时间是否为非工作日&#xff0c;是的话返回true&#xff0c;反之返回false 代码&#xff1a; packa…