手机客户端上传照片

这两天在处理手机端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 拍的照片太大了,这个替换字符串太耗资源了,所以这部分工作扔到服务器去出来了。

posted @ 2012-11-23 22:16  海已盗  阅读(333)  评论(0编辑  收藏  举报