hbuilder拍照上传,与asp.net服务器获取并保存

思路:手机拍照后,将图片用js转为base64字符串,传递给asp.net服务端

 

服务端解析base64,还原为图片,并保存

 

前端代码

 

        var f1=null;        //用来base64的字符串的变量
        
        function login()
        {
            
            var cmr = plus.camera.getCamera();          //启动照相机拍照
        
            var res = cmr.supportedImageResolutions[0];
            var fmt = cmr.supportedImageFormats[0];

            cmr.captureImage( function( path ){        //拍照成功后,会获取照片的相对路径
            
            plus.io.resolveLocalFileSystemURL( path, function ( entry ) {    
            var localurl = entry.toLocalURL();//                  //将相对路径转为绝对路径,相对路径的图片是无法转换为base64的
            
            
            document.getElementById("insert").innerHTML='<img src="'+localurl+'"userImage_id" />'
               
       
               
              appendFile(localurl);      //将图片路径传入函数,用来转化base64
               
               setTimeout("upload(1)", 1000); 
      });
            
        },
        function( error ) {                          //拍照未成功时提示
            alert( "Capture image failed: " + error.message );
        },
        {resolution:res,format:fmt}
    );


function appendFile(path)    

{



      var image = new Image();
      image.src = path;


      image.onload = function()

      {
            var base64 = getBase64Image(image);     //获取base64字符串,传入的是图片对象

            f1=base64;      //将局部变量转为全局变量


            f1=f1.slice(22);    //这一句很重要,我在这一句上折腾了半天,意思是:js转化成的base64字符串与c#的不一致,切掉22个字符,c#就能还原成图片了



            document.getElementById('inp1').innerText=base64;      //这一句我用来调试的,看看转成的字符串是什么样子的
      }


}



function getBase64Image(img)     //这是讲图片转为base64的主要语句,别问我为什么,我也不知道,网上抄来的,只要传入image对象,就能获取base64字符串,你照抄就行了
{
    var canvas = document.createElement("canvas");

    canvas.width = img.width;

    canvas.height = img.height;

    var ctx = canvas.getContext("2d");

    ctx.drawImage(img, 0, 0, img.width, img.height);

    var ext = img.src.substring(img.src.lastIndexOf(".")+1).toLowerCase();

    var dataURL = canvas.toDataURL("image/"+ext);                   //这里我测试过了,搞出的图片都是png的,你就是jpg的也一样

    return dataURL;
}




function lianjie()
{



  mui.post('http://192.168.30.2:33200/',{

  name:f1          //将base64传给30.2服务器上

  },function(data){



    alert(data);        //成功后会获取服务器返回的提示
  },'string'

);



}

 

 

 

前端结束,接下来是后端了

 

后端是用post取值的,一张图片转为base64,长度有30万个字符串,get接收参数长度有限,只能依靠post

 

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string base64 = Request.Form["name"];      //post获取base64字符串

        if (base64 == null)
        {
            Response.Write("空值");
        }
        else
        {
            if (base64.Length < 10)
            {
                mmf(base64);          //这一段我用来测试的,看看web是否正常运行
            }
            else
            {
                Image(base64);        //关键是这个函数
            }
        }

        //Image();

    }

    public void mmf(string bbs)
    {
        Response.Write("Hdahuang/"+bbs);


    }

    public void Image(string base64)
    {

        try
        {
            byte[] bytes = Convert.FromBase64String(base64);      //传入base64,保存位置改一改,返回字符看一看,其他地方都可以照抄

            MemoryStream memStream = new MemoryStream(bytes);

            Bitmap Bmap = new Bitmap(memStream);

            Bmap.Save(@"E:\118\123.png");            //这个也说明下,弄这个时候,抛出个GDI+异常,又搞了我半天,是因为文件夹权限不足,c#不能将图片保存到本地引起的,解决方案,自己百度
        }
        catch (Exception ex)
        {
            Response.Write(ex + "@@" + base64);
            return;
         
        }




        Response.Write("成功");
    }
}

 

posted @ 2017-11-07 16:54  唐尧  阅读(2108)  评论(5编辑  收藏  举报