这两天在处理手机端APP上传照片的功能(APP部分大部分由同事完成)。
首先是客户端把图片系列化,然后通过POST,提交到服务端。(客户端是利用Corona开发)
--引入mine包 local mime = require("mime") local fh, errStr = io.open( path, "rb" ) local contents = fh:read( "*a" ) --base64编码 local enc = mime.b64(contents) --Post传输数据时,[+]号会被转换成空格,导致服务端解码出错 --这边做个转换,替换成[%2B]。这边要用转义字符[%],否则报错
--后续调整到服务器取替换,这边不做出来 2013.2.28
enc = string.gsub(enc,"+","%%2B") io.close(fh) --返回数据 local function networkIndex(event) print(event.response) end local params = {} params.body = "img=" .. enc --POST 数据 network.request( url, "POST",networkIndex,params)
这边值得注意的是,服务端取这个数据时会出现[base-64 字符数组的无效长度]的错误,经过网上查找的原因是:图片是先系列化成base64编码格式的,但是在利用POST提交时,["+"]被编码成空格。服务端取的数据与原始数据不一致了,所以才会出现这个错误。
知道原因,那解决方案很简单,在提交数据前,把["+"]替换成["%2B"]即可。有点蛋疼的是,同事刚开始替换语句是这样写的
enc = string.gsub(enc,"+","%2B")
编译一直过不来,后来我才反应过来,应该是转义字符的问题,加了个百分号就ok了
至于服务端(Asp.net),就好处理了。我们直接在服务器上保存了。
string path = "your path"; string imageData = Request.Form["img"].ToString(); byte[] imageByte = Convert.FromBase64String(imageData); MemoryStream ms = new MemoryStream(imageByte); System.Drawing.Image img = System.Drawing.Image.FromStream(ms); img.Save(path);
总结:
在网页间传递编码后的数据时,要注意 ["+"] 号被编码成空格问题。另外Lua上的转义字符还需要学习
后记:
原先考虑到 base64 格式数据在 Post 到服务器时 [+]被编码,所以在客户端先进行替换,但是实际过程中,iphone 拍的照片太大了,这个替换字符串太耗资源了,所以这部分工作扔到服务器去出来了。