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

      }
?>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

石油石化应急三维电子沙盘系统研究分析与业务应用

一、概述 易图讯科技&#xff08;www.3dgis.top&#xff09;以大数据、云计算、虚拟现实、物联网、AI等先进技术为支撑&#xff0c;支持高清卫星影像、DEM高程数据、矢量数据、无人机倾斜摄像、BIM模型、点云、城市白模、等高线、标高点等数据融合和切换&#xff0c;集成油田原…

Unity-Shader-渲染队列

Unity-Shader-渲染队列 渲染简介Unity中的几种渲染队列Background (1000)最早被渲染的物体的队列。Geometry (2000) 不透明物体的渲染队列。大多数物体都应该使用该队列进行渲染&#xff0c;也就是Unity Shader中默认的渲染队列。AlphaTest (2450) 有透明通道&#xff0c;需要进…

巅峰画师Midjourney:新时代的独角兽

介绍 AI绘画领域中&#xff0c;Midjourney处于绝对地位&#xff0c;并且一年时间就登顶。 Midjourney是一家独立的AI研究实验室,探索新的思维媒介,拓展人类的想象力。 它由一个小型的自筹资金团队组成,专注于设计、人类基础设施和AI。 在AI绘画领域,Midjourney取得了非常突出…

SaaS医院信息化云his系统源码带电子病历+LIS系统

一、系统概述 •采用主流成熟技术&#xff0c;软件结构简洁、代码规范易阅读&#xff0c;SaaS 应用&#xff0c;全浏览器访问前后端分离&#xff0c;多服务协同&#xff0c;服务可拆分&#xff0c;功能易扩展&#xff1b; •支持多样化灵活配置&#xff0c;提取大量公共参数&am…

P7 RV1126推流项目 —— 写代码前的思路草图

目录 前言 01 项目介绍&#xff1a; 02 项目框图&#xff1a; 03 模块设计思路 3.1.rv1126_ffmpeg_main.cpp(主模块代码): 3.2.rkmedia_assignment_manage.cpp(RKMEDIA 任务管理模块) 3.3. rkmedia_data_process.cpp(RV1126 数据处理模块)&#xff1a; 3.4. rkmedia_…

详解IDEA git 版本回滚

作者简介 目录 1.git分区 2.未commit&#xff0c;进行回滚 3.commit未push&#xff0c;进行回滚 3.1.undo commit 3.2.reset 4.已commit&push&#xff0c;进行回滚 1.git分区 git的版本回滚其实就是回滚不同的分区&#xff0c;所以在聊git回滚之前我们有必要简单了解…

linux(centos)相关

文件架构&#xff1a; 用户组 查看用户组中的用户&#xff01; 用户 切换用户&#xff1a;su 提高用户权限命令&#xff1a;sudo 进程状态命令&#xff1a;top 杀死进程&#xff1a;kill 关机命令:shutdown 重启命令&#xff1a;reboot 时间同步 目录命令 ls pwd rm mv …

git中的smart checkout和force checkout

切换分支时出现了这个问题&#xff1a; 这是因为shiyan01分支修改了代码,但是没有commit, 所以在切换到test分支的时候弹出这个窗口 一、smart checkout(智能签出) 会把shiyan01分支的改动内容带到test分支。合并处理后的内容就变成了test分支的内容,而shiyan01分支的改动会被…

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

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

yolov7添加FPPI评价指标

学术上目标检测大多用mAP去评价一个模型的好坏&#xff0c;mAP用来作为比较模型的指标是挺好的&#xff0c;不过有个问题就是不够直观&#xff0c;比如mAP0.9到底代表什么呢&#xff1f;平均一个图会误检几个呢&#xff1f;该取什么阈值呢&#xff1f;mAP说明不了&#xff0c;所…

获取android签名

1、安装安卓模拟器&#xff0c;比如MuMu模拟器&#xff1b; 2、打包需要签名的apk&#xff0c;记住包名&#xff0c;比如org.ungleyou.uy,后面签名用得着&#xff1b; 3、下载签名工具&#xff0c;Gen_Signature_Android.apk&#xff1a; http://dlied5.qq.com/msdk/Gen_Sig…

【力扣题解】P101-对称二叉树-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P101-对称二叉树-Java题解&#x1f30f;题目描述&#x1f4a1;题解&#x1f30f;总结…

揭秘Pod状态与生命周期管理的秘密(上)

写在前面 前几篇文章中主要分享了k8s的几种控制器&#xff0c;本文将着重分享一下k8s最小的创建和部署单位pod的状态与生命周期管理。 点击 这里 可以查看所有相关文章。 Pod 概览 Pod 是 kubernetes 中你可以创建和部署的最小也是最简的单位。Pod 代表着集群中运行的进程。…

C# LINQ

一、前言 学习心得&#xff1a;C# 入门经典第8版书中的第22章《LINQ》 二、LINQ to XML 我们可以通过LINQ to XML来创造xml文件 如下示例&#xff0c;我们用LINQ to XML来创造。 <Books><CSharp Time"2019"><book>C# 入门经典</book><…

Quadratic Assignment Problem 二次分配问题

1 问题定义 二次分配问题&#xff08;Quadratic Assignment Problem&#xff0c;QAP&#xff09;是一种组合优化问题&#xff0c;涉及确定将设施分配到位置的最优方案。它的目标是找到最佳分配&#xff0c;以最小化设施对之间的总成本或距离&#xff0c;考虑到它们之间的相互作…

枚举(蓝桥杯备赛系列)acwing版

枚举 前言 hello&#xff0c;大家好&#xff0c;前面一段时间已经是把acwing Linux基础课讲完了&#xff0c;其实那些内容完全可以带领小白入门Linux我说过如果有人留言要Linux和Windows server 配置DNS Web ftp 的内容我就做一期&#xff0c;但是没人留言我也就先不自作多情了…

SpringSecurity6 | 退出登录后的跳转

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringSecurity6 ✨特色专栏: MySQL学习 🥭本文内容: SpringSecurity6 | 登录失败后的JSON处理 📚个人知识库: Leo知识库,…

联想发布天禧AI生态四端一体战略,聚焦智能体小程序开发

12月26日&#xff0c;2023联想天禧AI生态伙伴大会在北京正式召开&#xff0c;联想与英特尔、百度、网易有道等头部企业、400余家行业开发者和媒体齐聚一堂&#xff0c;以“AI生态 共赢未来”为主题&#xff0c;共同探讨未来AI生态发展及应用。联想集团副总裁、中国区消费业务群…

如何优化SEO的网站架构

通过优先考虑网站架构来提升你的SEO游戏–这是经常被忽视的有机性能的动力源。了解为什么清晰的结构至关重要&#xff0c;并获得对 SEO 友好的网站的提示。 当人们谈论高优先级的SEO活动时&#xff0c;他们通常会指出关键词研究、内容规划和链接建设等关键领域。 网站架构很少…

Text to image论文精读 TISE (Text-to-Image Synthesis Evaluation):用于文本到图像合成的评估度量工具包

TISE (Text-to-Image Synthesis Evaluation)是一款用于评估文本生成图像的Python评估工具箱。文章由Tan M. Dinh, Rang Nguyen, and Binh-Son Hua等人发表。 其以统一的方式促进、倡导公平的评估度量&#xff0c;并为未来的文本到图像综合研究提供可重复的结果。 文章链接&am…