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

news2025/2/4 5:59:40

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.coloradmin.cn/o/1337438.html

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

相关文章

.json文件转为.dll文件后还能读取吗?

(只是修改了后缀名而已&#xff0c;做一个伪装&#xff09; 测试&#xff1a; QFile file(QApplication::applicationDirPath() "/config.dll");qDebug()<<QApplication::applicationDirPath() "/config.dll";if (file.open(QIODevice::ReadOnly))…

css mask 案例

文章目录 一、基本用法二、图案遮罩二、文字阴影效果三、日历探照灯效果 CSS的mask属性用于定义一个可重复使用的遮罩&#xff0c;可以将其应用到任何可视元素上。这个功能类似于Photoshop中的图层蒙版。通过mask属性&#xff0c;可以创建独特的效果&#xff0c;比如圆形、渐变…

西门子博途怎么使用PID_Compact做pid调试

到目前为止&#xff0c;我已经在S7-1200中创建了一个可运行的PLC程序&#xff0c;并在Basic Panel中创建了一个HMI项目来操纵和操作该程序。 引文&#xff1a;博途工控人平时在哪里技术交流博途工控人社群 现在&#xff0c;我们该如何深入的让程序开始逐渐智能化呢&#xff0c…

少儿编程加盟培训机构管理系统源码开发方案

一、项目背景与目标 &#xff08;一&#xff09;项目背景 随着少儿编程教育的快速发展&#xff0c;加盟培训机构的数量不断增加。为了更好地管理学员信息、课程安排、教师工资等&#xff0c;需要开发一款少儿编程加盟培训机构管理系统源码。 &#xff08;二&#xff09;项目…

Nginx快速入门:实现企业安全防护|nginx部署https,ssl证书(七)

0. 引言 之前我们讲到nginx的一大核心作用就是实现企业安全防护&#xff0c;而实现安全防护的原理就是通过部署https证书&#xff0c;以此实现参数加密访问&#xff0c;从而加强企业网站的安全能力。 nginx作为各类服务的统一入口&#xff0c;只需要在入口处部署一个证书&…

12.鸿蒙HarmonyOS App(JAVA) page的隐式跳转

跳转到指定Page的指定AbilitySlice MainAbilitySlice按钮触发事件&#xff1a; btn.setClickedListener(component -> { Intent _intent new Intent(); Operation operation new Intent.OperationBuilder() .withBundleName(…

C++ std::string使用效率优化

字符串操作是任何一个C开发程序无法绕过的点&#xff0c;很多时候针对字符串的操作需要进行优化&#xff0c;从而达到更优的使用效率和内存利用率。一般会采用标准的std::string替代C字符串&#xff0c;一方面是std::string为一个成熟的类对象&#xff0c;其成员操作基本能满足…

std::string在 Windows MSVC和Linux Gcc 中capacity容量扩容策略的分析和对比

1、capacity()作用 在std::string中&#xff0c;capacity()为当前string占用内存字符的长度&#xff0c;表示当前string的容量&#xff0c;可以理解为一个预分配制度&#xff0c;如果当前的string不断进行扩展操作&#xff0c;则不需要每次都进行内存上的分配&#xff0c;提高程…

CentOS7搭建Elasticsearch与Kibana服务

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net 1.2拉取elasticsearch镜像 docker pull elasticsearch:7.11.1 1.3.运行 运行docker命令&#xff0c;部…

NLP论文阅读记录 - 以大语言模型为参考学习总结

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1文本生成模型的训练方法2.2 基于LLM的自动评估2.3 LLM 蒸馏和基于 LLM 的数据增强 三.本文方法3.1 Summarize as Large Language Models3.1.1 前提3.1.2 大型语言模型作为参考具有…

面向对象设计与分析40讲(15)简单工厂方法模式

文章目录 定义示例优缺点定义 简单工厂模式是一种创建型模式,用于根据客户端的需求创建对象实例,所谓的需求反映到编程语言里就是传入的参数。 简单工厂模式包括三个主要部分: 工厂类(Simple Factory):这是整个模式的核心。它负责根据客户端的请求来创建并返回相应的对…

罗门哈斯同级抛光树脂:单晶硅电池超纯水生产与应用

在光伏行业中&#xff0c;单晶硅电池是最高效和最可靠的太阳能电池之一。然而&#xff0c;生产单晶硅电池需要使用超纯水&#xff0c;这是许多光伏制造商所面临的一个挑战。那么&#xff0c;超纯水是如何生产的呢&#xff1f; 为什么需要超纯水&#xff1f; 超纯水是一种高纯…

vue3 setup + ts 项目模块找不到问题解决:Cannot find module ...

Vscode contrl shift p 打开vscode配置面板&#xff0c;查找typescript&#xff1b;是使用workspace version,完事儿

EternalBlue【永恒之蓝】漏洞详解(复现、演示、远程、后门、入侵、防御)内容丰富-深入剖析漏洞原理-漏洞成因-以及报错解决方法-值得收藏!

漏洞背景&#xff1a; 1.何为永恒之蓝&#xff1f; 永恒之蓝&#xff08;Eternal Blue&#xff09;爆发于2017年4月14日晚&#xff0c;是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限&#xff0c;以此来控制被入侵的计算机。甚至于2017年5月12日&#xff0c; 不法分子…

JavaScript基础练习题解析与实践

如果大家感感兴趣也可以去看&#xff1a; &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 学习…

HarmonyOS4.0系统性深入开发04UIAbility组件详解(下)

UIAbility组件间交互&#xff08;设备内&#xff09; UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时&#xff0c;会涉及到启动特定的UIAbility&#xff0c;该UIAbility可以是应用内的其他UIAbility&#xff0c;也可以是其他应用的UIAbility&#xff08;例如启…

LSTM的记忆能力实验 [HBU]

目录 模型构建 LSTM层 模型训练 多组训练 模型评价 模型在不同长度的数据集上的准确率变化图 模型汇总 总结 长短期记忆网络&#xff08;Long Short-Term Memory Network&#xff0c;LSTM&#xff09;是一种可以有效缓解长程依赖问题的循环神经网络&#xff0e;LSTM 的…

Text-to-SQL小白入门(十)RLHF在Text2SQL领域的探索实践

本文内容主要基于以下开源项目探索实践&#xff0c; Awesome-Text2SQL:GitHub - eosphoros-ai/Awesome-Text2SQL: Curated tutorials and resources for Large Language Models, Text2SQL, Text2DSL、Text2API、Text2Vis and more.DB-GPT-Hub&#xff1a;GitHub - eosphoros-ai…

【QML-按钮】

QML编程指南 VX&#xff1a;hao541022348 ■ 按钮■ AbstractButton■ Button■ CheckBox■ DelayButton■ RadioButton■ RoundButton&#x1f31f;■ Switch&#x1f31f;■ ToolButton&#x1f31f; ■ 按钮 ■ AbstractButton 所有的按钮控件的父类都是 AbstractButton 。…

Electron自定义通知Notification

Notification是什么&#xff1f; 对于渲染进程&#xff0c;Electron 允许开发者使用通知中API&#xff0c;来运行系统的原生通知进行显示。 如何实现系统Notification&#xff1f; const { Notification } require(electron);const isAllowed Notification.isSupported();…