• 手机客户端上传照片


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

  • 相关阅读:
    Data Race Patterns in Go https://eng.uber.com/dataracepatternsingo/
    To Push or Pull Data into Kafka Connect? 3 Ways to Send Data to Kafka
    企业服务总线建设之道的探索与研究
    云音乐低代码:基于 CodeSandbox 的沙箱性能优化
    并发渲染优化:让文件树的渲染又快又稳 https://mp.weixin.qq.com/s/3yy9V5HMDWPFwEf1cyLlw
    Redis缓存异常及处理方案总结
    控制grpc 流量 GRPC 性能 管理gRPC协议示例流量
    对各种异步回调都使用try catch错误上报
    技术 Leader 的思考方式
    从Redis7.0发布看Redis的过去与未来
  • 原文地址:https://www.cnblogs.com/haiyidao/p/2785123.html
Copyright © 2020-2023  润新知