html5

关注公众号 jb51net

关闭
网页制作 > html5 >

HTML5 Plus 实现手机APP拍照或相册选择图片上传功能

脚本之家

利用HTML Plus的Camera、GalleryIO、Storage和Uploader来实现手机APP拍照或者从相册选择图片上传。Camera模块管理设备的摄像头,可用于拍照、摄像操作,通过plus.camera获取摄像头管理对象。Gallery模块管理系统相册,支持从相册中选择图片或视频文件、保存图片或视频文件到相册等功能。通过plus.gallery获取相册管理对象。IO模块管理本地文件系统,用于对文件系统的目录浏览、文件的读取、文件的写入等操作。通过plus.io可获取文件系统管理对象。Storage模块管理应用本地数据存储区,用于应用数据的保存和读取。应用本地数据与localStorage、sessionStorage的区别在于数据有效域不同,前者可在应用内跨域操作,数据存储期是持久化的,并且没有容量限制。通过plus.storage可获取应用本地数据管理对象。Uploader模块管理网络上传任务,用于从本地上传各种文件到服务器,并支持跨域访问操作。通过plus.uploader可获取上传管理对象。Uploader上传使用HTTP的POST方式提交数据,数据格式符合Multipart/form-data规范,即rfc1867(Form-based File Upload in HTML)协议。 

XML/HTML Code复制内容到剪贴板
  1. <!doctype html>  
  2. <html class="feedback">  
  3.  <head>  
  4.   <meta charset="utf-8" />  
  5.   <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" />  
  6.   <meta name="misapplication-tap-highlight" content="no" />  
  7.   <meta name="HandheldFriendly" content="true" />  
  8.   <meta name="MobileOptimized" content="320" />  
  9.   <title>HTML5 Plus 拍照或者相册选择图片上传</title>  
  10.   <link rel="stylesheet" href="../../css/mui.min.css">  
  11.   <link rel="stylesheet" type="text/css" href="../../css/app.css" />  
  12.   <link rel="stylesheet" type="text/css" href="../../css/iconfont.css" />  
  13.   <link rel="stylesheet" type="text/css" href="../../css/feedback-page.css" />  
  14.   <link rel="stylesheet" href="../../css/font-awesome.min.css">  
  15.   <script src="../../js/jquery.js"></script>  
  16.   <script type="text/javascript" src="../../js/common.js"></script>  
  17.   <script type="text/javascript" src="../../js/utitls.js"></script>  
  18.   <script type="text/javascript" src="http://api.map.baidu.com/api?ak=59PBaEOro16CiH2W4CG81zEN&v=2.0"></script>  
  19.   <style type="text/css">  
  20.    .del {   
  21.     position: absolute;   
  22.     top:1px;   
  23.     right: 1px;    
  24.     display: block;         
  25.        line-height: 1;   
  26.        cursor: pointer;   
  27.        color:#fff;   
  28.     }   
  29.   
  30.    .del:hover {   
  31.     color:#ff3333;   
  32.    }   
  33.   </style>  
  34.   <style>  
  35.    .table-view {   
  36.     position: relative;   
  37.     margin-top: 0;   
  38.     margin-bottom: 0;   
  39.     padding-left: 0;   
  40.     list-style: none;   
  41.     background-color: #f5f5f5;   
  42.    }   
  43.       
  44.    .table-view-cell {   
  45.     position: relative;   
  46.     overflow: hidden;   
  47.     padding: 0px 15px;   
  48.     -webkit-touch-callout: none;   
  49.     margin-bottom: 1px;   
  50.    }   
  51.       
  52.    .table-view-cell:after {   
  53.     position: absolute;   
  54.     right: 0;   
  55.     bottom: 0;   
  56.     left: 0px;   
  57.     height: 1px;   
  58.     content: '';   
  59.     -webkit-transform: scaleY(.5);   
  60.     transform: scaleY(.5);   
  61.     background-color: #c8c7cc;   
  62.    }   
  63.       
  64.    .table-view-cell>a:not(.btn) {   
  65.     position: relative;   
  66.     display: block;   
  67.     overflow: hidden;   
  68.     margin: -0px -15px;   
  69.     padding: inherit;   
  70.     white-space: nowrap;   
  71.     text-overflow: ellipsis;   
  72.     color: inherit;   
  73.     background-color: #75b9f4;   
  74.     height: 40px;   
  75.     line-height: 40px;   
  76.    }   
  77.       
  78.    .navigate-right:after   
  79.    {   
  80.     font-family: Muiicons;   
  81.     font-size: inherit;   
  82.     line-height: 1;   
  83.     position: absolute;   
  84.     top: 50%;   
  85.     display: inline-block;   
  86.     -webkit-transform: translateY(-50%);   
  87.     transform: translateY(-50%);   
  88.     text-decoration: none;   
  89.     color: #666;   
  90.     -webkit-font-smoothing: antialiased;   
  91.    }   
  92.       
  93.    .table-view-cell.collapse .collapse-content {   
  94.     position: relative;   
  95.     display: none;   
  96.     overflow: hidden;   
  97.     margin: 0px -15px 0px;   
  98.     padding: 0px 0px !important;   
  99.     -webkit-transition: height .35s ease;   
  100.     -o-transition: height .35s ease;   
  101.     transition: height .35s ease;   
  102.     background-color: transparent;   
  103.    }   
  104.    .image-item{   
  105.     position: relative;   
  106.    }   
  107.    .image-item .info{   
  108.     position: absolute;   
  109.     top:0px;   
  110.     left:4px;   
  111.     color: #ff9900;   
  112.     font-size: 12px;         
  113.        
  114.    }   
  115.   </style>  
  116.  </head>  
  117.  <body>  
  118.   <header class="bar bar-nav">  
  119.    <h1 class="title">拍照或者相册选择图片上传</h1>  
  120.   </header>  
  121.   <div class="content">  
  122.    <div style="margin-top: 10px;"></div>  
  123.    <input type="hidden" id="ckjl.id" name="ckjl.id" value="429">  
  124.      <div class="collapse-content" >  
  125.       <form>  
  126.        <label class="row-label"></label>  
  127.        <div id='F_CKJLBS' class="row image-list">  
  128.         <div class="image-item " id="F_CKJLB" onclick="showActionSheet(this);"></div>  
  129.       </div>  
  130.       </form>  
  131.      </div>  
  132.   </div>  
  133.   <script src="../../js/mui.min.js"></script>  
  134. <script>  
  135.  var procinstid = 0;   
  136.  //初始化页面执行操作   
  137.  function plusReady() {   
  138.   //Android返回键监听事件   
  139.   plus.key.addEventListener('backbutton',function(){   
  140.    myclose();   
  141.   },false);   
  142.  }   
  143.  if (window.plus) {   
  144.   plusReady();   
  145.  } else {   
  146.   document.addEventListener('plusready', plusReady, false);   
  147.  }   
  148.   //加载页面初始化需要加载的图片信息   
  149.   //或者相册IMG_20160704_112620.jpg   
  150.   //imgId:图片名称:1467602809090或者IMG_20160704_112620   
  151.   //imgkey:字段例如:F_ZDDZZ   
  152.   //ID:站点编号ID,例如429   
  153.   //src:src="file:///storage/emulated/0/Android/data/io.dcloud.HBuilder/.HBuilder/apps/HBuilder/doc/upload/F_ZDDZZ-1467602809090.jpg"  
  154.   function showImgDetail (imgId,imgkey,id,src) {     
  155.    var html = "";   
  156.    html +='<div  id="Img'+imgId+imgkey+'" class="image-item ">';    
  157.    html +=' <img id="picBig" data-preview-src="" data-preview-group="1" '+src+'/>';   
  158.    html +=' <span class="del" onclick="delImg(\''+imgId+'\',\''+imgkey+'\','+id+');">';       
  159.    html +='  <div class="fa fa-times-circle"></div>';    
  160.    html +=' </span>';    
  161.    html +='</div>';   
  162.    $("#"+imgkey+"S").append(html);   
  163.   }   
  164.   //删除图片   
  165.   //imgId:图片名称:IMG_20160704_112614   
  166.   //imgkey:字段,例如F_ZDDZZ   
  167.   //ID:站点编号ID,例如429   
  168.   function delImg(imgId,imgkey,id){   
  169.    var bts = ["是", "否"];   
  170.    plus.nativeUI.confirm("是否删除图片?", function(e) {   
  171.      var i = e.index;   
  172.      if (i == 0) {   
  173.       var itemname=id+"img-"+imgkey;//429img-F_ZDDZZ   
  174.       var itemvalue=plus.storage.getItem(itemname);   
  175.       //{IMG_20160704_112614,_doc/upload/F_ZDDZZ-IMG_20160704_112614.jpg,file:///storage/emulated/0/Android/data/io.dcloud...../doc/upload/F_ZDDZZ-1467602809090.jpg}   
  176.       if(itemvalue!=null){   
  177.        var index=itemvalue.indexOf(imgId+",");   
  178.        if(index==-1){//没有找到   
  179.         delImgfromint(imgId,imgkey,id,index);   
  180.        }else{    
  181.         delImgFromLocal(itemname,itemvalue,imgId,imgkey,index); //修改,加了一个index参数   
  182.        }   
  183.           
  184.       }else{   
  185.        delImgfromint(imgId,imgkey,id);    
  186.       }   
  187.      }   
  188.     },"查勘", bts);   
  189.    /*var isdel = confirm("是否删除图片?");   
  190.    if(isdel == false){   
  191.     return;   
  192.    }*/   
  193.       
  194.       
  195.   }   
  196.   function delImgFromLocal(itemname,itemvalue,imgId,imgkey,index){   
  197.      var wa = plus.nativeUI.showWaiting();   
  198.      var left=itemvalue.substr(0,index-1);   
  199.      var right=itemvalue.substring(index,itemvalue.length);   
  200.      var end=right.indexOf("}");   
  201.      rightright=right.substring(end+1,right.length);   
  202.      var newitem=left+right;   
  203.      plus.storage.setItem(itemname,newitem);    
  204.      myAlert("删除成功");   
  205.      $("#Img"+imgId+imgkey).remove();   
  206.      wa.close();   
  207.   }   
  208.   //选取图片的来源,拍照和相册   
  209.   function showActionSheet(conf){   
  210.      var divid = conf.id;   
  211.            var actionbuttons=[{title:"拍照"},{title:"相册选取"}];   
  212.            var actionstyle={title:"选择照片",cancel:"取消",buttons:actionbuttons};   
  213.            plus.nativeUI.actionSheet(actionstyle, function(e){   
  214.               if(e.index==1){   
  215.                getImage(divid);   
  216.               }else if(e.index==2){   
  217.                galleryImg(divid);   
  218.               }   
  219.            } );   
  220.         }   
  221.   //相册选取图片   
  222.         function galleryImg(divid) {   
  223.             plus.gallery.pick( function(p){   
  224.              //alert(p);//file:///storage/emulated/0/DCIM/Camera/IMG_20160704_112620.jpg   
  225.              plus.io.resolveLocalFileSystemURL(p, function(entry) {   
  226.               //alert(entry.toLocalURL());//file:///storage/emulated/0/DCIM/Camera/IMG_20160704_112620.jpg   
  227.      //alert(entry.name);//IMG_20160704_112620.jpg   
  228.      compressImage(entry.toLocalURL(),entry.name,divid);   
  229.     }, function(e) {   
  230.      plus.nativeUI.toast("读取拍照文件错误:" + e.message);   
  231.     });   
  232.             }, function ( e ) {   
  233.             }, {   
  234.              filename: "_doc/camera/",   
  235.              filter:"image"   
  236.             } );   
  237.         }   
  238.   // 拍照   
  239.   function getImage(divid) {   
  240.    var cmr = plus.camera.getCamera();   
  241.    cmr.captureImage(function(p) {   
  242.     //alert(p);//_doc/camera/1467602809090.jpg   
  243.     plus.io.resolveLocalFileSystemURL(p, function(entry) {   
  244.      //alert(entry.toLocalURL());//file:///storage/emulated/0/Android/data/io.dcloud...../doc/camera/1467602809090.jpg   
  245.      //alert(entry.name);//1467602809090.jpg   
  246.      compressImage(entry.toLocalURL(),entry.name,divid);   
  247.     }, function(e) {   
  248.      plus.nativeUI.toast("读取拍照文件错误:" + e.message);   
  249.     });   
  250.    }, function(e) {   
  251.    }, {   
  252.     filename: "_doc/camera/",   
  253.     index: 1   
  254.    });   
  255.   }   
  256.   //压缩图片   
  257.   function compressImage(url,filename,divid){   
  258.    var name="_doc/upload/"+divid+"-"+filename;//_doc/upload/F_ZDDZZ-1467602809090.jpg   
  259.    plus.zip.compressImage({   
  260.      src:url,//src: (String 类型 )压缩转换原始图片的路径   
  261.      dst:name,//压缩转换目标图片的路径   
  262.      quality:20,//quality: (Number 类型 )压缩图片的质量.取值范围为1-100   
  263.      overwrite:true//overwrite: (Boolean 类型 )覆盖生成新文件   
  264.     },   
  265.     function(event) {    
  266.      //uploadf(event.target,divid);   
  267.      var path = name;//压缩转换目标图片的路径   
  268.      //event.target获取压缩转换后的图片url路   
  269.      //filename图片名称   
  270.      saveimage(event.target,divid,filename,path);   
  271.     },function(error) {   
  272.      plus.nativeUI.toast("压缩图片失败,请稍候再试");   
  273.    });   
  274.   }   
  275.   //保存信息到本地   
  276.   /**   
  277.    *    
  278.    * @param {Object} url  图片的地址   
  279.    * @param {Object} divid  字段的名称   
  280.    * @param {Object} name   图片的名称   
  281.    */   
  282.   function saveimage(url,divid,name,path){   
  283.    //alert(url);//file:///storage/emulated/0/Android/data/io.dcloud...../doc/upload/F_ZDDZZ-1467602809090.jpg   
  284.    //alert(path);//_doc/upload/F_ZDDZZ-1467602809090.jpg   
  285.    var  state=0;   
  286.    var wt = plus.nativeUI.showWaiting();   
  287.     //  plus.storage.clear();    
  288.    namename=name.substring(0,name.indexOf("."));//图片名称:1467602809090   
  289.    var id = document.getElementById("ckjl.id").value;   
  290.    var itemname=id+"img-"+divid;//429img-F_ZDDZ   
  291.    var itemvalue=plus.storage.getItem(itemname);   
  292.    if(itemvalue==null){   
  293.     itemvalue="{"+name+","+path+","+url+"}";//{IMG_20160704_112614,_doc/upload/F_ZDDZZ-IMG_20160704_112614.jpg,file:///storage/emulated/0/Android/data/io.dcloud...../doc/upload/F_ZDDZZ-1467602809090.jpg}   
  294.    }else{     
  295.     itemvalueitemvalue=itemvalue+"{"+name+","+path+","+url+"}";   
  296.    }   
  297.    plus.storage.setItem(itemname, itemvalue);   
  298.       
  299.    var src = 'src="'+url+'"';   
  300.    //alert("itemvalue="+itemvalue);   
  301.    showImgDetail(name,divid,id,src);   
  302.    wt.close();   
  303.       
  304.   }   
  305.   //上传图片,实例中没有添加上传按钮   
  306.   function uploadimge(agree,back) {   
  307.   //plus.storage.clear();   
  308.    var wa = plus.nativeUI.showWaiting();   
  309.    var DkeyNames=[];   
  310.    var id = document.getElementById("ckjl.id").value;    
  311.    var length=id.toString().length;    
  312.    var ididnmae=id.toString();   
  313.    var numKeys=plus.storage.getLength();   
  314.    var task = plus.uploader.createUpload(getUrl() + 'url', {   
  315.         method: "POST"   
  316.        },   
  317.        function(t, status) {   
  318.         if (status == 200) {   
  319.          console.log("上传成功");   
  320.           $.ajax({   
  321.           type: "post",   
  322.           url: getUrl() + 'url',   
  323.           data: {   
  324.            taskId: taskId,   
  325.            voteAgree: agree,   
  326.            back: back,   
  327.            voteContent: $("#assign").val(),   
  328.           },   
  329.           async: true,   
  330.           dataType: "text",   
  331.           success: function(data) {   
  332.            wa.close();   
  333.            goList(data);   
  334.              
  335.               
  336.           },   
  337.           error: function() {   
  338.            wa.close();   
  339.            myAlert("网络错误,提交审批失败,请稍候再试");   
  340.           }   
  341.          });   
  342.              
  343.             
  344.         } else {   
  345.          wa.close();   
  346.          console.log("上传失败");    
  347.         }   
  348.        }   
  349.       );   
  350.    task.addData("id",id);   
  351.    for(var i=0; i<imgArray.length;i++){     
  352.     var itemkey=id+"img-"+imgArray[i];   
  353.      if(plus.storage.getItem(itemkey)!=null){   
  354.      var itemvalue=plus.storage.getItem(itemkey).split("{");   
  355.      for(var img=1;img<itemvalue.length;img++){   
  356.       var imgname=itemvalue[img].substr(0,itemvalue[img].indexOf(","));   
  357.       var imgurl=itemvalue[img].substring(itemvalue[img].indexOf(",")+1,itemvalue[img].lastIndexOf(","));   
  358.       task.addFile(imgurl,{key:imgurl});   
  359.      }   
  360.     }   
  361.    }   
  362.    task.start();   
  363.       
  364.   }   
  365. </script>  
  366. </body>  
  367. </html>  
  368.   

效果图:

             


             


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

原文链接:http://blog.csdn.net/qq_27626333/article/details/51896616