SpringMVC H5 js摄像头拍照 ajax上传返回url路径
2017-08-09 00:07
399 查看
前几日项目中遇到的问题,对于这个问题网上的资料都不算完整,不过大概思路有很多,今天这里我就实现一下:
canvas用于显示照片,video用于实时预览摄像头
本方法需引入JQ与ajaxfileupload,点我下载
根据路径引入
拍照前必须先调用该方法进行初始化摄像头,并允许浏览器使用摄像头
该方法在谷歌等浏览器最新版中必须使用HTTPS方可支持,目前在360浏览器以及谷歌老版本(44版)可支持!
本方法使用ajaxfileupload,需引入
一、前端标签
canvas用于显示照片,video用于实时预览摄像头<input class="btn btn-primary radius" type="button" onclick="paizhao()" id="pai" value=" 拍照 "> <input class="btn btn-primary radius" type="button" onclick="upload()" value=" 上传 "><br> <canvas id="canvas" ></canvas> <video id="video" autoplay=""> <script>camera();</script>
二、JS方法
本方法需引入JQ与ajaxfileupload,点我下载根据路径引入
<script type="text/javascript" src="lib/jquery/1.9.1/jquery.min.js"></script> <script type="text/javascript" src="lib/ajaxfileupload/ajaxfileupload.js"></script>
(1)下面该方法为初始化摄像头方法:
拍照前必须先调用该方法进行初始化摄像头,并允许浏览器使用摄像头该方法在谷歌等浏览器最新版中必须使用HTTPS方可支持,目前在360浏览器以及谷歌老版本(44版)可支持!
function camera() { var video=document.getElementById("video"); var context=canvas.getContext("2d"); var errocb=function(){ console.log("sth srong"); } if(navigator.getUserMedia){ navigator.getUserMedia({"video":true},function(stream){ video.src=stream; video.play(); },errocb); }else if(navigator.webkitGetUserMedia){ navigator.webkitGetUserMedia({"video":true},function(stream){ video.src=window.webkitURL.createObjectURL(stream); video.play(); },errocb); } }
(2)下面该方法为拍照方法:
function paizhao(){ var video=document.getElementById("video"); var context=canvas.getContext("2d"); document.getElementById("canvas").setAttribute("width",$('#video').width());//设置canvas的宽度 document.getElementById("canvas").setAttribute("height",$('#video').height());//设置canvas的高度 context.drawImage(video, 0, 0,$("#canvas").width(), $("#canvas").height());//将video截图到canvas canvasflag=true; }
(3)下面该方法为ajax上传方法:
本方法使用ajaxfileupload,需引入function upload(){ var pic = document.getElementById("canvas").toDataURL("image/jpg");//将canvas转换为base64数据 pic = pic.replace(/^data:image\/(png|jpg);base64,/, "");//使用正则表达式将base64前方头去掉 $.ajaxFileUpload({ url:'uploadPic.naah',//该处为我们的ajax上传URL data:{imageData:pic},//imageData为后台接收pic的名字 dataType:'text/html',//ajax返回的url success:function(data,status){ var reg = /<pre.+?>(.+)<\/pre>/g; var result = data.match(reg); //使用正则表达式将格式去掉 data = RegExp.$1; alert(data); //data为最后的url }, error:function(data,status,e){ alert("图片上传失败..."); } }); }
三、后端方法
(1)后端代码
@RequestMapping("uploadPic.naah") public void uploadPic(HttpServletRequest request,HttpServletResponse response,HttpSession session,String imageData) throws Exception { //获取绝对路径 String dirPath = request.getSession().getServletContext().getRealPath("files\\images"); //注意点:实际的图片数据是从 data:image/jpeg;base64后开始的 ,在前台我们已将该数据格式掉了 byte[] k = decodeBase64(imageData); InputStream is = new ByteArrayInputStream(k); //以每日年月日作为文件夹名 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); String middlePath = sdf.format(new Date()); //用毫秒数作为文件的文件名 Long time = System.currentTimeMillis(); String fileNameStr = time + ".jpg";//文件名=毫秒数+扩展名 //生成要返回的url String path = "files/images/" + middlePath + "/" + fileNameStr; //生成文件保存路径 String picPath = dirPath + "\\" + middlePath + "\\" + fileNameStr; //生成文件夹 dirPath = dirPath + "\\" + middlePath; //写进文件 File p = new File(dirPath); File a = new File(picPath); //创建文件夹 if (!p.exists()) { p.mkdirs(); } //创建文件 if (!a.exists()) { a.createNewFile(); } FileOutputStream fos = new FileOutputStream(a); //写入文件 fos.write(k); fos.flush(); fos.close(); fos = null; //ajax返回url PrintWriter writer = response.getWriter(); writer.write(path); writer.flush(); writer.close(); }
(2)通过反射机制调用java内部base64解密方法
public static byte[] decodeBase64(String input) throws Exception { Class clazz = Class.forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64"); Method mainMethod = clazz.getMethod("decode", String.class); mainMethod.setAccessible(true); Object retObj = mainMethod.invoke(null, input); return (byte[]) retObj; }
相关文章推荐
- JavaEE_Mybatis_SpringMVC (异步上传)SpringMvc文件上传 通过ajaxupfileload.js
- ajaxFileupload.js修复上传无法携带参数,返回json格式不准确问题
- h5 js 图片预览并判断 ajax上传
- Ajax上传根据服务器端返回数据进行js处理
- struts2 使用ajaxfileupload.js上传文件,处理返回是总是进入Error函数
- spring mvc 下使用ajaxfileupload.js 异步上传文件 并返回信息 各种问题解决
- SpringMVC结合ajaxfileupload.js实现文件无刷新上传
- 通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
- h5调用摄像头+拍照+上传图片-----h5+js+ajax
- 为什么返回的数据前面有callback? ashx/json.ashx?的后面加 callback=? 起什么作用 js url?callback=xxx xxx的介绍 ajax 跨域请求时url参数添加callback=?会实现跨域问题
- springMVC结合ajaxfileupload.js实现图片的上传及时显示
- js调用本地摄像头截图并用ajax上传至后台服务器完成交互
- SpringMVC结合ajaxfileupload.js实现异步上传文件
- 通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
- Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
- java opencv 调用摄像头实现拍照及本地保存 支持上传FTP 路径配置
- SpringMVC结合ajaxfileupload.js实现文件无刷新上传
- H5拍照/图片上传js
- H5调用手机的摄像头拍照上传以及手机相册选取照片但不支持Android的分析
- SpringMVC结合ajaxfileupload.js实现文件无刷新上传