移动端H5拍照代码实现及外网部署
最近的工作中,遇到了一个需求:对于无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拍照代码实现及外网部署的更多相关文章
- 移动端h5拍照压缩即时上传后台并预览
项目经理让迭代一个功能,实时预览并上传到后台的功能,听到这立马想起了几个第三方插件去实现,mui 和api cloude万万没想到的是这个app前面使用ios 和安卓原生写的,然后mui和api c ...
- 移动端 H5 拍照 从手机选择图片,移动端预览,图片压缩,图片预览,再上传服务器
前言:最近公司的项目在做全网营销,要做非微信浏览器的wap 站 的改版,其中涉及到的一点技术就是采用H5 选择手机相册中的图片,或者拍照,再将获取的图片进行压缩之后上传. 这个功能模块主要有这5点比较 ...
- [转]C#取得内网IP、外网IP、客户端IP方法
前言 在 Windows Form Application 里对于取得 IP Address 有内网.外网两种 IP Address ,如果只需要取得内网 IP Address ,可以透过使用 IPH ...
- 怎样从外网访问内网MongoDB数据库?
本地安装了一个MongoDB数据库,只能在局域网内访问到,怎样从外网也能访问到本地的MongoDB数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动MongoDB数据库 默认安装 ...
- 怎样从外网访问内网MySQL数据库?
本地安装了一个MySQL数据库,只能在局域网内访问到,怎样从外网也能访问到本地的MySQL数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动MySQL数据库 默认安装的MySQL ...
- 怎样从外网访问内网Oracle数据库?
本地安装了一个Oracle数据库,只能在局域网内访问到,怎样从外网也能访问到本地的Oracle数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Oracle数据库 默认安装的Or ...
- 怎样从外网访问内网SQLServer数据库?
本地安装了一个SQLServer数据库,只能在局域网内访问到,怎样从外网也能访问到本地的SQLServer数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动SQLServer数据 ...
- 怎样从外网访问内网PostgreSQL数据库?
本地安装了一个PostgreSQL数据库,只能在局域网内访问到,怎样从外网也能访问到本地的PostgreSQL数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动PostgreSQ ...
- 怎样从外网访问内网Redis数据库?
本地安装了一个Redis数据库,只能在局域网内访问到,怎样从外网也能访问到本地的Redis数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Redis数据库 默认安装的Redis ...
随机推荐
- Zookeeper应用之——栅栏(barrier)
Zookeeper应用之——栅栏(barrier) 栅栏(barrier)简介 barrier的作用是所有的线程等待,知道某一时刻,锁释放,所有的线程同时执行.举一个生动的例子,比如跑步比赛,所有 运 ...
- python 文本处理操作
打开和关闭文件 open 函数 用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写 ''' 模式 描述 r 以只读方式打开文件.文件的指针将会放在文 ...
- 当SQL Server的实例位于集群的特定节点时,数据库无法远程访问
搭建好了一个集群环境,发现当SQL Server的实例位于集群的其中一个节点时,数据库无法远程访问,报如下错误.但在另一个 节点时,数据库访问正常. 标题: 连接到服务器 -------------- ...
- liteos 从入门到放弃
这两天收到一份sdk,hisi 3516cv200 liteos的sdk 正好手头有硬件,就随便编译玩玩. 解压sdk. Hi3518E_SDK_V5.0.5.0 ll@ubuntu:~/work20 ...
- BIOS备忘录之x86硬件编程(寄存器与IO)
SOC固件(BIOS)开发: 1.熟悉硬件原理图:要弄清楚pin脚的功能: 2.配置GPIO引脚,配置成Native功能还是GPIO功能(如果是配置成GPIO,需要在code里面显式的使用): 3.硬 ...
- 配置firewalld端口转发
题:在系统 system1 设定端口转发,要求: 1.在172.24.8.0/24网络中的系统,访问system1的本地端口 5423 将被转发到 80 2.此设置必须永久有效 答: # 配置转发端口 ...
- Maven+SSM框架(Spring+SpringMVC+MyBatis)(二)
1.基本概念 2.开发环境搭建 3.Maven Web项目创建 4.SSM整合 此次整合我分两个配置文件: 1)分别是spring-mybatis.xml,包含spring和mybatis的配置文件, ...
- img 兼容问题 css图片与图片之间总是会存在缝隙
解决方案: 法宝一:定义图片img标签vertical-align:bottom,vertical-align:middle,vertical-align:top. img{vertical-alig ...
- gulp的安装与使用【附配置代码】
备忘 1.配置 下载安装node.js node -v //检查nodejs版本 npm(nodejs package manager)nodejs包管理工具 nodejs完毕在命令行输入np ...
- Bootstrap3基础 page-header 标题下加分割线
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...