当前位置:   article > 正文

Unity如何上传图片、生成二维码、服务器存储图片_unity+阿里云实现上传图片分享二维码

unity+阿里云实现上传图片分享二维码

这边文章主要叙述如何将图片文件上传到服务器,服务器如何接收保存,客户端如何生成二维码。关于如何用网页展示图片,并结合微信分享将另开文章叙述。


文件上传

之前文件上传一直使用的是FTP,后来由于使用了阿里云,云服务器对于FTP的请求方式有一定的限制,从客户端角度来说,需要设置为主动模式,导致原来的代码即使这么设置,仍然无法访问,因此后来改成了HTTP的传输方式(即unity的www请求一个url,服务器用php准备好这个url),所以目前是将图片文件转为base64的字符串,通过Post传给服务器。

base64转换

  1. //图片转base64string
  2. public string Texture2dToBase64(string texture2d_path)
  3. {
  4. //将图片文件转为流文件
  5. FileStream fs = new System.IO.FileStream(texture2d_path, System.IO.FileMode.Open, System.IO.FileAccess.Read);
  6. byte[] thebytes = new byte[fs.Length];
  7. fs.Read(thebytes, 0, (int)fs.Length);
  8. //转为base64string
  9. string base64_texture2d = Convert.ToBase64String(thebytes);
  10. return base64_texture2d;
  11. }

Post请求

Unity2018及再之后,WWW的方法需要改写,以下代码可能过时。这里在接口定义层面,需要服务器的php在处理完成之后返回处理状态:0000 上传成功 其他的表示一种错误情况。filename表示文件名,不含路径,urlpath表示你要传的相对位置。由于拍照活动有很多,文件上传是可以复用的,所以会有urlpath这样的字段。

  1. IEnumerator UploadFile()
  2. {
  3. print("开始上传文件:" + filename);
  4. WWWForm form = new WWWForm();
  5. form.AddField("filename", filename);
  6. form.AddField("urlpath", urlpath);
  7. form.AddField("data", Texture2dToBase64(filepath));
  8. WWW www = new WWW("www.你的域名.com/upload.php", form);
  9. //UnityWebRequest request = UnityWebRequest.Post ("www.你的域名.com/upload.php", form);
  10. yield return www;
  11. //yield return request;
  12. if( www.text.Trim() == "0000")
  13. {
  14. result = 1;
  15. print("上传成功");
  16. }
  17. else
  18. {
  19. print(www.text);
  20. result = 0;
  21. //print("上传失败");
  22. }
  23. //if (request.ToString().Trim() == "0000")
  24. //{
  25. // result = 1;
  26. // print("上传成功");
  27. //}
  28. //else
  29. //{
  30. // print(request.ToString());
  31. // result = 0;
  32. // //print("上传失败");
  33. //}
  34. }

服务器接收

服务器是基于宝塔面板建立的,我使用了php5.6去写接收文件的代码,由于拍照应用运行环境比较单纯,所以我没有实现除了0000返回码以外的返回码逻辑。代码比较简单,就是锁定好要上传的路径,得到data,解base64码,写入文件。

  1. <?php
  2. $filename = $_POST['filename'];
  3. $urlpath = $_POST['urlpath'];
  4. if(!(substr($urlpath,strlen($urlpath)-1,strlen($urlpath)) == '/'))
  5. $urlpath = $urlpath.'/';
  6. $base_img = $_POST['data'];
  7. $ifp = fopen( '../'.$urlpath.$filename, "wb" );
  8. fwrite( $ifp, base64_decode( $base_img) );
  9. fclose( $ifp );
  10. //file_put_contents('index.txt',$filename); //如果文件不存在创建文件,并写入内容
  11. echo "0000";
  12. ?>

客户端生成二维码

用ZXing,ZXing是一个支持在图像中解码和生成条形码(如二维码)的库。是一个开源的实现的一维/二维条码图像处理库,有到对unity的专门的支持,下载资源:ZXing-Unity部分-可生成二维码的库

这里说明一下URL需要根据你展示图片的网页文件去决定,比如我的是showpic.php,GET方式获取参数,那么下文代码中的str应该是 http://www.xxx.com/showpic.php?filename=1001.jpg

  1. using System.Collections;
  2. using UnityEngine;
  3. using System.IO;
  4. using System;
  5. using ZXing;
  6. using ZXing.QrCode;
  7. using UnityEngine.UI;
  8. public class FileUpload : MonoBehaviour {
  9. /// <summary>
  10. /// 返回指定URL的二维码
  11. /// </summary>
  12. /// <param name="str">url,比如http://www.xxx.com/showpic.php?filename=1001.jpg</param>
  13. /// <returns></returns>
  14. public Texture2D ShowCode(string str)
  15. {
  16. encoded = new Texture2D(256, 256);
  17. //QRCodes = str;
  18. var textForEncoding = str ;
  19. if (textForEncoding != null)
  20. {
  21. //二维码写入图片
  22. var color32 = Encode1(textForEncoding, encoded.width, encoded.height);
  23. encoded.SetPixels32(color32);
  24. encoded.Apply();
  25. return encoded;
  26. }
  27. return null;
  28. }
  29. //定义方法生成二维码
  30. private static Color32[] Encode1(string textForEncoding, int width, int height)
  31. {
  32. var writer = new BarcodeWriter
  33. {
  34. Format = BarcodeFormat.QR_CODE,
  35. Options = new QrCodeEncodingOptions
  36. {
  37. Height = height,
  38. Width = width
  39. }
  40. };
  41. return writer.Write(textForEncoding);
  42. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/715855
推荐阅读
相关标签
  

闽ICP备14008679号