【Unity3D日常开发】Unity3D中实现向Web服务器上传图片以及下载图片功能

推荐阅读

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

今天分享一下从搭建web服务器,到向服务器发送图片,以及加载图片的整体实现。

因为是Demo演示,所以尽可能的简单、详细且实用,有什么错误敬请指正。

先看一下效果图
【Unity3D日常开发】Unity3D中实现向Web服务器上传图片以及下载图片功能
文章参考:Unity向Web服务器上传和下载图片

二、搭建PHP服务器

搭建PHP服务器还是很简单的,只需要一个软件phpStudyPHP集成环境。

phpStudy支持LAMP(Linux+Apache+MySQL+PHP)WAMP(Windows+Apache+MySQL+PHP)

LAMP和WAMP都是指一组用来搭建动态网站或者服务器的开源软件,软件自身都是独立的程序。

因为常常放到一起使用,所以拥有较高的兼容性,共同组合乘一个强大的Web应用程序平台。

首先,去PhpStudy官网下载安装包:
【Unity3D日常开发】Unity3D中实现向Web服务器上传图片以及下载图片功能
正常安装完,打开程序,运行Apache:
【Unity3D日常开发】Unity3D中实现向Web服务器上传图片以及下载图片功能
切换到网站面板,点击管理,在下拉菜单中选择打开网站
【Unity3D日常开发】Unity3D中实现向Web服务器上传图片以及下载图片功能
看到欢迎界面说明phpStudy安装并启动成功:
【Unity3D日常开发】Unity3D中实现向Web服务器上传图片以及下载图片功能
切换到网站面板,点击管理,在下拉菜单中选择打开根目录
【Unity3D日常开发】Unity3D中实现向Web服务器上传图片以及下载图片功能
删除index.html,新建index.php,用文本编辑器打开index.php,修改php代码:

<?php
if(isset($_FILES['ImgData']))//判断有没有指定字段
{
	$folder=$_POST["folder"];//文件夹名 upload
	$fileName=$_FILES["ImgData"]["name"];//文件名 xxx.jpg
	$tmp=$_FILES["ImgData"]["tmp_name"];//临时存储的文件名  C:\Windows\php251.tmp
	$fil=$folder.'/'.$fileName;//文件路径 upload/001.png
	
	if(file_exists($folder))//判断有没有这个文件夹 
	{
		if(file_exists($fil))//判断有没有这个文件 
		{	
			unlink($fil);//删除文件
			move_uploaded_file($tmp,$fil);//上传
		}
		else
		{
			move_uploaded_file($tmp,$fil);//没文件直接上传
		}
	}
	else
	{
		mkdir($folder,0777);//新建文件夹
		move_uploaded_file($tmp,$fil);//上传文件
	}
	echo $fil;
}
?>

注释标记比较清楚,如果想要学习php的也可以理解一下php代码。

其实语言都是相通的,可以多学习一下其他语言。

三、搭建Unity场景

新建一个RawImage
【Unity3D日常开发】Unity3D中实现向Web服务器上传图片以及下载图片功能
新建一个脚本,命名为WebManager,双击打开脚本编辑脚本:

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class WebManager : MonoBehaviour
{
    public RawImage myRaw;
    public Texture2D m_uploadImage;
    string m_info = "";
    string imgPath = "";

    //图片上传服务器
    IEnumerator IRequestPic(string imgName)
    {
        string url = "http://127.0.0.1:80/index.php";//这里需要注意一下phpStudy中的端口号
        WWWForm form = new WWWForm();
        form.AddField("folder", "upload");
        form.AddBinaryData("ImgData", m_uploadImage.EncodeToPNG(), imgName + ".png", "image/png");
        UnityWebRequest req = UnityWebRequest.Post(url, form);
        yield return req.SendWebRequest();
        if (req.isHttpError || req.isNetworkError)
        {
            m_info = "上传失败";
        }
        if (req.isDone && !req.isHttpError)
        {
            m_info = "上传成功";
            imgPath = req.downloadHandler.text;
        }
    }

    //服务器下载图片
    IEnumerator DownLoadPic()
    {
        string url = "http://127.0.0.1:80/" + imgPath;
        using (UnityWebRequest request = new UnityWebRequest(url))
        {
            //下载图像作为纹理使用
            DownloadHandlerTexture texDl = new DownloadHandlerTexture(true);
            request.downloadHandler = texDl;
            yield return request.SendWebRequest();
            if (request.isHttpError || request.isNetworkError)
            {
                m_info = request.error;
            }
            else
            {
                myRaw.texture = texDl.texture;
            }
        }
    }

    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, 110, 150, 30), "上传 Image"))
        {
            StartCoroutine(IRequestPic("01"));
        }
        if (GUI.Button(new Rect(10, 140, 150, 30), "下载 Image"))
        {
            StartCoroutine(DownLoadPic());
        }
        GUI.EndGroup();
    }
}

主要注意一下端口号:80,不同的可能会有区别,打开phpStudy,切换到网站面板可以看到端口号:
【Unity3D日常开发】Unity3D中实现向Web服务器上传图片以及下载图片功能
运行程序,就可以上传图片和下载图片了。

上一篇:Unity3D学习笔记——RigidBody(刚体)


下一篇:Unity3D小游戏——血条