赞
踩
这边文章主要叙述如何将图片文件上传到服务器,服务器如何接收保存,客户端如何生成二维码。关于如何用网页展示图片,并结合微信分享将另开文章叙述。
之前文件上传一直使用的是FTP,后来由于使用了阿里云,云服务器对于FTP的请求方式有一定的限制,从客户端角度来说,需要设置为主动模式,导致原来的代码即使这么设置,仍然无法访问,因此后来改成了HTTP的传输方式(即unity的www请求一个url,服务器用php准备好这个url),所以目前是将图片文件转为base64的字符串,通过Post传给服务器。
- //图片转base64string
- public string Texture2dToBase64(string texture2d_path)
- {
- //将图片文件转为流文件
- FileStream fs = new System.IO.FileStream(texture2d_path, System.IO.FileMode.Open, System.IO.FileAccess.Read);
- byte[] thebytes = new byte[fs.Length];
- fs.Read(thebytes, 0, (int)fs.Length);
- //转为base64string
- string base64_texture2d = Convert.ToBase64String(thebytes);
- return base64_texture2d;
- }
Unity2018及再之后,WWW的方法需要改写,以下代码可能过时。这里在接口定义层面,需要服务器的php在处理完成之后返回处理状态:0000 上传成功 其他的表示一种错误情况。filename表示文件名,不含路径,urlpath表示你要传的相对位置。由于拍照活动有很多,文件上传是可以复用的,所以会有urlpath这样的字段。
- IEnumerator UploadFile()
- {
-
- print("开始上传文件:" + filename);
- WWWForm form = new WWWForm();
- form.AddField("filename", filename);
- form.AddField("urlpath", urlpath);
-
- form.AddField("data", Texture2dToBase64(filepath));
- WWW www = new WWW("www.你的域名.com/upload.php", form);
- //UnityWebRequest request = UnityWebRequest.Post ("www.你的域名.com/upload.php", form);
- yield return www;
- //yield return request;
-
- if( www.text.Trim() == "0000")
- {
- result = 1;
- print("上传成功");
- }
- else
- {
- print(www.text);
- result = 0;
- //print("上传失败");
- }
- //if (request.ToString().Trim() == "0000")
- //{
- // result = 1;
- // print("上传成功");
- //}
- //else
- //{
- // print(request.ToString());
- // result = 0;
- // //print("上传失败");
- //}
-
- }
服务器是基于宝塔面板建立的,我使用了php5.6去写接收文件的代码,由于拍照应用运行环境比较单纯,所以我没有实现除了0000返回码以外的返回码逻辑。代码比较简单,就是锁定好要上传的路径,得到data,解base64码,写入文件。
- <?php
- $filename = $_POST['filename'];
- $urlpath = $_POST['urlpath'];
-
- if(!(substr($urlpath,strlen($urlpath)-1,strlen($urlpath)) == '/'))
- $urlpath = $urlpath.'/';
- $base_img = $_POST['data'];
- $ifp = fopen( '../'.$urlpath.$filename, "wb" );
- fwrite( $ifp, base64_decode( $base_img) );
- fclose( $ifp );
- //file_put_contents('index.txt',$filename); //如果文件不存在创建文件,并写入内容
- echo "0000";
- ?>
用ZXing,ZXing是一个支持在图像中解码和生成条形码(如二维码)的库。是一个开源的实现的一维/二维条码图像处理库,有到对unity的专门的支持,下载资源:ZXing-Unity部分-可生成二维码的库
这里说明一下URL需要根据你展示图片的网页文件去决定,比如我的是showpic.php,GET方式获取参数,那么下文代码中的str应该是 http://www.xxx.com/showpic.php?filename=1001.jpg
- using System.Collections;
- using UnityEngine;
- using System.IO;
- using System;
- using ZXing;
- using ZXing.QrCode;
- using UnityEngine.UI;
-
- public class FileUpload : MonoBehaviour {
-
- /// <summary>
- /// 返回指定URL的二维码
- /// </summary>
- /// <param name="str">url,比如http://www.xxx.com/showpic.php?filename=1001.jpg</param>
- /// <returns></returns>
- public Texture2D ShowCode(string str)
- {
- encoded = new Texture2D(256, 256);
- //QRCodes = str;
- var textForEncoding = str ;
- if (textForEncoding != null)
- {
- //二维码写入图片
- var color32 = Encode1(textForEncoding, encoded.width, encoded.height);
- encoded.SetPixels32(color32);
- encoded.Apply();
- return encoded;
- }
- return null;
- }
-
- //定义方法生成二维码
- private static Color32[] Encode1(string textForEncoding, int width, int height)
- {
- var writer = new BarcodeWriter
- {
- Format = BarcodeFormat.QR_CODE,
- Options = new QrCodeEncodingOptions
- {
- Height = height,
- Width = width
- }
- };
- return writer.Write(textForEncoding);
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。