作者:oneym
本文地址:http://blog.csdn.net/oneym/article/details/48734049
游戏中图片的上传下载是一个亘古不变的话题,这次在开发游戏服务器的过程中也不可避免的出现了图片下载和上传的问题。遇到了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图片会出现透明部分黑掉。下载后会出现与上传的图片大小不一致的问题,这个问题后来使用了文件校验的方式来解决了。
图片上传的时候除了要发送校验方式还需要一并发送相关的数据。最初的想法是要把相关的信息在图片中保存(没有分开),后面的解决方法是将图片和数据再一次发送中分开,做成一个数据封包。这样做的效果显著,顺利的解决了我的问题。
这边给一个测试用的表单,如下:
$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点集中给出。
图片下载后会在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环境下下载只需要修改保存路径就好。
客户端发送一张图片到服务器,这张图片我们想让他与我们的用户信息进行有效关联。这就会产生在发送图片的时候附带发送一些额外的信息。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
是指的图片校验信息。通过校验信息服务端就可以校验图片的真确性。
这个问题的解决使用的是在第3点上传附加信息中的图片校验字段信息,我们可以在下载的时候将之前上传的校验信息再读取出来,对图片进行二次校验。如果校验失败可以再次下载。
这样可以避免图片下载出错的问题。其实我跟换下载方式后就没有出现过这种问题了。这里只是列出来,使用最初的下载方式会带来的影响。
如果对文章有疑问可以通过邮箱[email protected]
与我一起探讨。
也可以加入QQ群137163838
,开源我们的思维,点亮整个世界!。