程序需要用到一个拍照保存到云端的功能,数据可以保存到数据库和服务器,首先不建议保存到数据库,原因就是太慢了,所以就选择了保存到服务器。

一、Unity端:

1、获取图片的数据,一般传送图片的时候都会先把图片转换成二进制数据。

2、使用WWWForm类创建表单。

3、最后使用WWW类上传到服务器即可。

using System.Collections;
using UnityEngine;

public class TestWWW : MonoBehaviour
{
    public Sprite imgae;
    string url = "http://。。。。/Upload.php";
    string CreateURL = "http://。。。。/CreatFolder.php";
    string DelURL = "http://。。。。/DelFolder.php";

    void Start()
    {
        StartCoroutine(CreatFolder("Photos"));//在服务器上创建文件夹
        //StartCoroutine(DelFolder("Photos"));//在服务器上删除文件夹
        //StartCoroutine(Upload());//上传图片到服务器指定的文件夹
    }

    //创建文件夹
    IEnumerator CreatFolder(string FolderName)
    {
        WWWForm wForm = new WWWForm();
        wForm.AddField("FolderName", FolderName);
        WWW w = new WWW(CreateURL, wForm);
        yield return w;
        if (w.isDone)
        {
            Debug.Log("创建文件夹完成");
        }
    }

    //删除文件夹
    IEnumerator DelFolder(string FolderName)
    {
        WWWForm wForm = new WWWForm();
        wForm.AddField("FolderName", FolderName);
        WWW w = new WWW(DelURL, wForm);
        yield return w;
        if (w.isDone)
        {
            Debug.Log("删除文件夹完成");
        }
    }

    //上传图片到指定的文件夹
    IEnumerator Upload()
    {
        byte[] bytes = SpriteToBytes(imgae);//获取图片数据
        WWWForm form = new WWWForm();//创建提交数据表单
        form.AddField("folder", "Photos/");//定义表单字段用来定义文件夹
        form.AddBinaryData("file", bytes, "11.png", "image/png");//字段名,文件数据,文件名,文件类型
        WWW w = new WWW(url, form);
        yield return w;
        if (w.isDone)
        {
            Debug.Log("上传完成");
        }
    }

    //获取图片的二进制数据
    public byte[] SpriteToBytes(Sprite sp)
    {
        Texture2D t = sp.texture;
        byte[] bytes = t.EncodeToJPG();
        return bytes;
    }
}

二、服务端PHP

1、创建文件夹

<?php
$myFile = $_POST["FolderName"];//获取要创建的文件夹名字
 //文件存储路径
 if(!file_exists($myFile))//判断文件夹是否存在
     mkdir($myFile,0777);//创建文件夹,并指定权限为0777才可以上传文件保存进去
?>

2、删除文件夹

在删除之前需要先遍历当前文件夹是否是根目录,若是根目录则先删除文件,最后删除文件夹,若是当前文件夹中还有文件夹则继续向深度遍历。

<?php
$myFile = $_POST["FolderName"];
//调用函数,传入路径
deleteDir($myFile);//调用删除方法

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

3、上传图片到指定文件夹中

在这里入了坑,因为文件夹的名字不能确定,开始的时候我连同文件夹和名字一起发送到服务端("Photos/hhh.png"),试了很多次都没有存进去,最后使用保存信息到文本,查看字符串信息。才发现服务器的$fileName =$_FILES["file"]["name"];这句话直接把斜杠前面的自动给我截掉了,都没有收到文件夹的完整信息,所以没有存进去,折腾了好久。

<?php

//$_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["file"]["name"];//根据表单字段接收需要保存的文件名字
$tmp=$_FILES["file"]["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($_FILES["file"]["tmp_name"], $fil);
    }
?>