一前言
游戏中图片的上传下载是一个亘古不变的话题, 这次在开发游戏服务器的过程中也不可避免的出现了图片下载和上传的问题遇到了 PNG 图片下载完成后透明的部分变成黑色图片上传附带验证信息下载后文件不一样的问题
二问题回顾
服务器上面保存了一张完整的 png 图片, 图片中有大片的透明部分在图片下载到本地后出现透明部分变成了黑色我是用的是下面的方法:
- String url = "http://IP:port/XXX.png";
- WWW www = new WWW(url);
- Texture2D image = www.texture;
- byte[] imageByte = image.EncodeToPNG();
- String outSavePaht = "本地路径 \ XXX.png";
- File.WriteAllBytes(outSavePaht, imageByte);
用这个方法下载下来的 PNG 图片会出现透明部分黑掉下载后会出现与上传的图片大小不一致的问题, 这个问题后来使用了文件校验的方式来解决了
图片上传的时候除了要发送校验方式还需要一并发送相关的数据最初的想法是要把相关的信息在图片中保存(没有分开), 后面的解决方法是将图片和数据再一次发送中分开, 做成一个数据封包这样做的效果显著, 顺利的解决了我的问题
三一个可行的解决方案
1 图片上传(服务端接收)
这边给一个测试用的表单, 如下:
- $this - >show('<form action="__URL__/upload"enctype="multipart/form-data"method="post" >
- <input type="file" name="img" />
- <input type="submit" value="提交" >
- </form>');
其中
upload
方法如下:
- public
- function upload() {
- $upload = new\Think\Upload(); // 实例化上传类
- $upload - >maxSize = 3145728; // 设置附件上传大小
- $upload - >exts = array('jpg', 'gif', 'png', 'jpeg'); // 设置附件上传类型
- $upload - >rootPath = './'; // 设置附件上传根目录
- $upload - >savePath = 'Uploads/'; // 设置附件上传 (子) 目录
- // 上传文件
- $info = $upload - >upload();
- if (!$info) { // 上传错误提示错误信息
- $this - >error($upload - >getError());
- } else { // 上传成功
- $this - >success('上传成功!');
- }
- }
上传成功后会将图片存储在根目录下的 Uploads 文件夹下客户端的图片上传方法在第 3 点集中给出
2 图片下载
图片下载后会在 Unity3d 中使用, 这里用 C# 代码来下载
- webClient wc = new WebClient();
- wc.Headers.Add("User-Agent", "Chrome");
- wc.DownloadFile(tempUrl, outSavePaht); //tempUrl 是图片地址, outSavePath 是图片存储的绝对的路径
通过 WebClient 申明的对象 wc 来下载一张 URL 类似于
http://IP:port/xxx.png
保存到本地类似于
C:\xxx.png
的路径里面通过这个方法就可将网络图片下载到本地, 如果需要在 linux 环境下下载只需要修改保存路径就好
3 上传图片时附带其他信息(包含图片校验信息)
客户端发送一张图片到服务器, 这张图片我们想让他与我们的用户信息进行有效关联这就会产生在发送图片的时候附带发送一些额外的信息 Unity3d 中提供了一个很好的表单方法, 对这个表单进行合理使用是可以达到发送图片的同时附带我们自定义的信息的下面演示一下:
- FileStream fs = File.OpenRead(imagePath);
- int len = (int) fs.Length;
- byte[] b = new byte[len];
- fs.Read(b, 0, len);
- WWWForm form = new WWWForm();
- form.AddField("info", infostr);
- form.AddBinaryData("img", b, fileName.Trim(), "multipart/form-data");
- WWW www = new WWW(url, form);
最后根据服务器的返回值来判断图片的上传情况, 其中
info
字段就是我们的自定义字段, 我现在的
info
是指的图片校验信息通过校验信息服务端就可以校验图片的真确性
4 下载的图片和上传到服务器的图片大小不一致
这个问题的解决使用的是在第 3 点上传附加信息中的图片校验字段信息, 我们可以在下载的时候将之前上传的校验信息再读取出来, 对图片进行二次校验如果校验失败可以再次下载
这样可以避免图片下载出错的问题其实我跟换下载方式后就没有出现过这种问题了这里只是列出来, 使用最初的下载方式会带来的影响
来源: http://lib.csdn.net/article/unity3d/37013