zoukankan      html  css  js  c++  java
  • 手机客户端上传照片

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

  • 相关阅读:
    大话设计模式笔记 观察者模式
    nginx限速
    枚举实现的单例模式
    Nginx负载均衡
    插件lombok的介绍安装
    ThreadLocal类
    CopyOnWriteArrayList并发容器
    ConcurrentHashMap实现原理
    elasticsearch配置文件
    sql优化
  • 原文地址:https://www.cnblogs.com/haiyidao/p/2785123.html
Copyright © 2011-2022 走看看