程序需要用到一个拍照保存到云端的功能,数据可以保存到数据库和服务器,首先不建议保存到数据库,原因就是太慢了,所以就选择了保存到服务器。
一、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);
}
?>