最近的工作中,遇到了一个需求:对于无APP登陆权限的人员,提供拍照上传功能,以便生成更完善的出工记录。经研究讨论,决定实现的机制为:由合法的人员登陆APP认领相关工作任务,并生成当天当工作的唯一二维码,无APP登陆权限的人员扫描二维码,使用H5页面进行自拍,完善出工记录。我负责了H5拍照及拍照信息保存部分。该部分工作独立性较强,其中也有许多难点的解决过程值得记录。所以写了这篇文章记录,并且在github中写了一个demo。希望能帮助到有需要的人。

一:环境配置

  简介:该demo前端使用h5+jquery,后端使用java。因为时间关系,没有保存数据库。移动端拍完照后,直接保存到了服务器本地文件夹下。

  1.从github下载demo,并引入到ecplise中。

  2.服务器使用tomcat,建议使用Catalina\localhost路径下新增.xml文件来配置服务,注意若xml文件有名称时,如a.xml,tpf.js 中的action请求需要需要加上/a 。否则web.xml 无法捕获相应请求

  3.文件传输需要的jar包都在lib下面,引入就行(ojdbc.jar是后续完善可能会用到的jar),另外还需要引入你tomcat的common/lib下面的jsp-api.jar 和 servlet-api.jar

  4.tpf下的xr.properties配置了文件保存根路径,这里的文件是用于ecplise上方便查看和版本管理的,真正起作用的是WEB-INF/classes下的xr.properties。布置服务时请注意替换。

  5.使用tomcat直接启动服务,或者eclipse中配置tomcat,在eclipse中启动服务。服务地址 http://localhost:8090/main/page/tpf.html (第二步中的xml文件的文件名为空时),文件保存路径为E:\tpfData1\image\年\月\日(xr.properties中配置了根路径E:\tpfData1)

  6.内外网映射用了nat123。配置如下

  

  应用类型需要选择80网站,变相的会收取30块钱费用,提供的服务大概能支持100KB的照片上传时不报文件流连接超时。内网端口和内网地址就是你本机访问服务时的地址和端口号,外网域名用他随机的就行。

二:前端代码说明

  1.调用照相机服务是通过

<input type="file" name="file_head" id="file_head" onchange="setImagePreview();" accept="image/*" capture="camera" style="display: none" />

属性 capture="camera" ,会让手机默认调用照相机拍照。不设置该属性的话则会让你选择拍照或从相册中选取照片。

属性 onchange="setImagePreview();" ,是在手机拍照后,获取照片路径并展示在页面上。(为了测试方便也支持电脑网页上传图片类型附件后展示附件)

  2.提交服务是通过form表单提交的。最开始试过ajax,文件流转base64再分段传输,后台再拼接转换成文件流,不知道是编码格式问题还是分段后数据依旧过长,尝试了很久也未成功,最后还是改用了form表单提交。form表单提交后会重定向当前页面,所以设置了 document.forms[0].target = "frameFile"; ,将重定向页面指向了一个隐藏的iframe。监听iframe重定位完成状态,并给出提醒。

  3.为了页面优化,隐藏了”朴素的“的file标签,改用自定义的图片,再在js中调用file标签。

  4.浏览器自带的alert,会显示用户的IP信息,故使用调用common.js中的changeAlert() 方法,隐藏掉了这个IP显示(不适用与IE)。

  5.checkDate() 方法是用于验证url上的参数是否合法,合法后再加载页面监听事件。该功能暂时未实现,故直接加载了监听事件。

三:后台代码说明

  1.文件上传主处理类是UploadFileServlet,该类接受了文件流及基本的数据。另外,该类也获取了请求的ip地址,并将这些数据传给了了特点的文件处理类。

  2.特定的文件处理类是配在js中,该类需要实现了接口UploadFileInterface。获取xr.properties中文件保存的根目录,以及通过当前的时间设置更详细的文件路径,将文件流保存到该文件路径下。

  3.文件加间的斜杠方向通过  System.getProperty("file.separator") 获取,因为windows和linux的文件路径书写方式略有不同。


以上就是该demo中各个文件的功能以及部署的过程。欢迎指正及讨论。转载请注明出处。

  

  

  

移动端H5拍照代码实现及外网部署的更多相关文章

  1. 移动端h5拍照压缩即时上传后台并预览

    项目经理让迭代一个功能,实时预览并上传到后台的功能,听到这立马想起了几个第三方插件去实现,mui  和api cloude万万没想到的是这个app前面使用ios 和安卓原生写的,然后mui和api c ...

  2. 移动端 H5 拍照 从手机选择图片,移动端预览,图片压缩,图片预览,再上传服务器

    前言:最近公司的项目在做全网营销,要做非微信浏览器的wap 站 的改版,其中涉及到的一点技术就是采用H5 选择手机相册中的图片,或者拍照,再将获取的图片进行压缩之后上传. 这个功能模块主要有这5点比较 ...

  3. [转]C#取得内网IP、外网IP、客户端IP方法

    前言 在 Windows Form Application 里对于取得 IP Address 有内网.外网两种 IP Address ,如果只需要取得内网 IP Address ,可以透过使用 IPH ...

  4. 怎样从外网访问内网MongoDB数据库?

    本地安装了一个MongoDB数据库,只能在局域网内访问到,怎样从外网也能访问到本地的MongoDB数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动MongoDB数据库 默认安装 ...

  5. 怎样从外网访问内网MySQL数据库?

    本地安装了一个MySQL数据库,只能在局域网内访问到,怎样从外网也能访问到本地的MySQL数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动MySQL数据库 默认安装的MySQL ...

  6. 怎样从外网访问内网Oracle数据库?

    本地安装了一个Oracle数据库,只能在局域网内访问到,怎样从外网也能访问到本地的Oracle数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Oracle数据库 默认安装的Or ...

  7. 怎样从外网访问内网SQLServer数据库?

    本地安装了一个SQLServer数据库,只能在局域网内访问到,怎样从外网也能访问到本地的SQLServer数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动SQLServer数据 ...

  8. 怎样从外网访问内网PostgreSQL数据库?

    本地安装了一个PostgreSQL数据库,只能在局域网内访问到,怎样从外网也能访问到本地的PostgreSQL数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动PostgreSQ ...

  9. 怎样从外网访问内网Redis数据库?

    本地安装了一个Redis数据库,只能在局域网内访问到,怎样从外网也能访问到本地的Redis数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Redis数据库 默认安装的Redis ...

随机推荐

  1. MongoSpark 28799错误

    Exception : . The full response is { , "codeName" : "Location28799" } at com.mon ...

  2. eclipse无法断点调试JDK源码的问题

    最近换了新版的eclipse,在jdk源码里面,打断点发现无法进入源码调试,程序直接跳过,已查资料发现自己eclipse配置的是jre环境的. 此处要配成jdk目录才有效 打开preferences, ...

  3. Dom 兼容处理

    获取子节点:childNodes 在IE下是可以正常使用的 但是在FF包含了文本节点需要配合nodeType做个类型判断  1是元素节点  3是文本节点 也可以采用 children IE       ...

  4. 提bug

    大多数公司都是用bugzilla来管理bug,也有的公司使用内部开发的bug管理平台.这里以bugzilla为例,我最不爽的是提bug的时候既要选择severity(严重级别)又要选择priority ...

  5. expect拷贝文件例子

    ----安装expectcd /tmp wget http://core.tcl.tk/tcl/zip/release/tcl.zipwget https://jaist.dl.sourceforge ...

  6. 数据库只有mdf文件而没有ldf文件,如何恢复数据库

    举例:数据库名为 TestData 第一步: 新建一个同名的数据库即TestData数据库 第二步: 停掉数据库服务,找到刚才新建的TestData数据库的mdf和ldf文件,删掉ldf文件,再用之前 ...

  7. 第十届蓝桥杯2019年C/C++ 大学B组省赛试题

    2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组 试题 A:组队 本题总分:5分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容. 每位球 ...

  8. Win32汇编学习(10):对话框(1)

    现在我们开始学习一些有关GUI编程的有趣的部分:以对话框为主要界面的应用程序. 理论: 如果您仔细关注过前一个程序就会发现:您无法按TAB键从一个子窗口控件跳到另一个子窗口控件,要想转移的话只有 用鼠 ...

  9. Learning-MySQL【1】:数据库初识及 MySQL 的安装

    一.什么是数据 数据(Data):描述事务的符号记录,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机 在计算机中描述一个事物, ...

  10. codeforce 955c --Sad powers 思路+二分查找

    这一题的题意是   定义一个数,该数特点是为a的p次方 (a>0,p>1) 再给你n个询问,每个询问给出一个区间,求区间内该数的数目. 由于给出的询问数极大(10e5) 所以,容易想到应该 ...