PC端獲取攝像頭圖片並上傳的實現

說明:(1)在頁面上顯示攝像頭錄像。

            (2)將攝像頭的某個幀截屏到img裏(實際是base64的圖像編碼)

            (3)調用jquery上傳圖片(非文件上傳的模式)

             (4)使用Spring MVC 解析並保存圖片。

這個功能主要參考了下面兩個鏈接(一個是截屏,一個是上傳):

下面是html代碼(注意需要將頁面放在tomcat裏運行,直接在系統裏打開是不行的)

 https://www.cnblogs.com/jiangcheng-langzi/p/8391497.html
https://www.cnblogs.com/MrSong97/p/9523666.html

<html>
<head>
<head>
<title> 打開攝像頭並截取照片須本地tomcat下運行</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script src="js/jquery.1.7.2.min.js" type="text/javascript" charset="utf-8"></script>
<script language="javascript">

//將dataUrl轉換爲blob準備上傳
function b64toBlob(b64Data, contentType='', sliceSize=512) {
        const byteCharacters = atob(b64Data);
        const byteArrays = [];

        for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
            const slice = byteCharacters.slice(offset, offset + sliceSize);

            const byteNumbers = new Array(slice.length);
            for (let i = 0; i < slice.length; i++) {
                byteNumbers[i] = slice.charCodeAt(i);
            }

            const byteArray = new Uint8Array(byteNumbers);

            byteArrays.push(byteArray);
        }

      const blob = new Blob(byteArrays, {type: contentType});
      return blob;
}

window.onload = function () {
           var canvas = document.getElementsByTagName('canvas')[0],
               context = canvas.getContext('2d'),
               video = document.getElementsByTagName("video")[0],
               snap = document.getElementById("snap"),
                 close = document.getElementById("close"),
               start = document.getElementById("start"),
               MediaStreamTrack;
           start.addEventListener('click', function () {
               if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
                   navigator.mediaDevices.getUserMedia({
                       video: true,
                       audio: true
                   }).then(function (stream) {
                       console.log(stream);
                       MediaStreamTrack=typeof stream.stop==='function'?stream:stream.getTracks()[1];
                       video.src=(window.URL).createObjectURL(stream);
                       video.play();
                   }).catch(function(err){
                       console.log(err);
                   });
               }else if(navigator.getMedia){
                   navigator.getMedia({
                       video: true
                   }).then(function (stream) {
                       console.log(stream);
                       MediaStreamTrack=stream.getTracks()[1];
                       video.src=(window.webkitURL).createObjectURL(stream);
                       video.play();
                   }).catch(function(err){
                       console.log(err);
                   });
               }
           });
           snap.addEventListener('click', function () {
               context.drawImage(video, 0, 0,200,150);
               //console.log(canvas.toDataURL()); //也可以指定圖像格式: var strDataURI = oCanvas.toDataURL("image/jpeg");   得到是base64圖像流 
              //將圖像顯示到img元素:
              //下面將圖片顯示到圖像組件
              var dataurl =  canvas.toDataURL("image/jpeg");
                document.getElementById("demo").src= dataurl;//
          

              
           });

      

           close.addEventListener('click', function () {
               MediaStreamTrack && MediaStreamTrack.stop();
           });
       }


        function upload()
        {
            var ImageURL = document.getElementById("demo").src;
            //var ImageURL2 = document.getElementById("demo2").src;
 
            var block = ImageURL.split(";");
       

            // Get the content type of the image
            const contentType = block[0].split(":")[1];// In this case "image/jpeg"

            // get the real base64 content of the file
            
            const realData = block[1].split(",")[1];//
       

            // Convert it to a blob to upload
            var blob = b64toBlob(realData, contentType);
         

            // new a formData
            
            const formData = new FormData();
         
             formData.append('blob',blob);
            
            //formData.append('blob1', blob);//模擬在增加第二個,一次傳2張
            // upload
             $.ajax({
                url:"/portal/rest/ucenterapi/testuploadvideo",
                data: formData,
                type:"POST",
                contentType:false,
                processData:false,
                error:function(err){
                },
                success:function(data){
                alert('hi');
                }
            });

 
        
        }
 
       </script>
       </head>
<body>

<video width="200px" height="150px"></video>
  <canvas width="200px" height="150px"></canvas>
  <p>
      <button id="start">打開攝像頭</button>
      <button id="snap">截取身份證正面</button>
      <!--<button id="snap2">截取身份證背面</button>-->
      
      <button id="close">關閉攝像頭</button>

      <button id="uploadFile" οnclick="upload()">上傳身份證</button>
     

       
  </p>
  <p>
  <img id="demo" src=""/>
  <img id="demo2" src=""/>


</body>
</html>

下面是spring MVC接口代碼:

@RequestMapping(value="/testuploadvideo",method={RequestMethod.POST,RequestMethod.GET}) //,RequestMethod.GET
      public @ResponseBody Object  testuploadvideo
      (
           HttpServletRequest request, HttpServletResponse response) throws Exception 
      {
        
        logger.info("調用視頻截圖::::");
        
        

        
        //https://blog.csdn.net/niuch1029291561/article/details/17377903
        
        // 圖片新名字
        HashMap<String,Object>  map = new HashMap();
    
          //遍歷頭部檢查accessToken
            Enumeration<?> enum1 = request.getHeaderNames();
          //檢查頭部信息
          while (enum1.hasMoreElements()) 
          {
               String key = (String) enum1.nextElement();
               String value = request.getHeader(key);
               System.out.println(key + "\t" + value);
          }
          //遍歷傳入參數
          Enumeration em = request.getParameterNames();
          while (em.hasMoreElements()) 
          {
              String name1 = (String) em.nextElement();
              String value = request.getParameter(name1);
              logger.info(name1+"/"+value);
              
          }
           
          //logger.info("上傳身份證照照片");
        //應該檢查access_token如果access_token超時則不允許上傳,防止傳入過多的垃圾圖片。

        CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(
                request.getSession().getServletContext());
        //檢查form中是否有enctype="multipart/form-data"
        if(multipartResolver.isMultipart(request))
        {
             
            //將request變成多部分request
            MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
           //獲取multiRequest 中所有的文件名
            Iterator iter=multiRequest.getFileNames();
             int i=0;
            while(iter.hasNext()) //暫時先處理一個
            {
                i++;
                logger.info("第"+String.valueOf(i)+"個文件!");
                //一次遍歷所有文件
             
                MultipartFile picFile=multiRequest.getFile(iter.next().toString());
                if(picFile!=null)
                {
                     
                    //String path="E:/springUpload"+file.getOriginalFilename();
                    //上傳
                  //  file.transferTo(new File(path));
                    
                    String name = StringUtil.getUUID();
                    String oldName = "aaaaaaa.jpg";//picFile.getOriginalFilename();
                    String dt = StringUtil.getCurrentDateTime();
                    String fullPath = request.getRealPath("/")+"upload/"+dt.substring(0,4)+"/"+dt.substring(5,7)+"/"+dt.substring(8,10)+"/";
                    File file = new File(fullPath);
                     
                    if(!fullPath.endsWith("/"))fullPath+="/";
                    file.mkdirs();
                    // 後綴名
                    String exeName = oldName.substring(oldName.lastIndexOf("."));
                     File pic = new File(fullPath + name + exeName);
                     logger.info("上傳文件地址:");
                     logger.info(fullPath + name + exeName);
                     String path1 = "/portal"+"/upload/"+dt.substring(0,4)+"/"+dt.substring(5,7)+"/"+dt.substring(8,10)+"/"+name + exeName;
                     
                     logger.info(path1);
                    // 保存圖片到本地磁盤
                    picFile.transferTo(pic);
                    //Map map = new HashMap();
                    map.put("url", path1);
                    map.put("rowId", name);

                    map.put("code", 0);
                      map.put("msg", "上傳頭像成功!");
                      return  map;
                    
                }
                 
            }
           
        }

   
          return map;
      
         
 
    }

下面是頁面效果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章