最近的工作中,遇到了一个需求:对于无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 ...
随机推荐
-
Android开发者的Kotlin:书
原文标题:Kotlin for Android Developers: The book 原文链接:http://antonioleiva.com/kotlin-android-developers/ ...
-
C#软件设计——小话设计模式原则之:依赖倒置原则DIP
前言:很久之前就想动笔总结下关于软件设计的一些原则,或者说是设计模式的一些原则,奈何被各种bootstrap组件所吸引,一直抽不开身.群里面有朋友问博主是否改行做前端了,呵呵,其实博主是想做“全战”, ...
-
Android Studio升级后,开启时遇到tools.jar seems to be not in Android Studio错误?
工作半年多,电子工程小白一枚.今天上班的时候,与几位同事聊到博客的问题.平时都是在别人的博客里找到问题的解决之妙法, 今天一个冲动之下,我决定也开始用博客记录工作的点滴,暂且当作笔记一用. 出于工作需 ...
-
Memcached 分布式缓存实现原理
摘要 在高并发环境下,大量的读.写请求涌向数据库,此时磁盘IO将成为瓶颈,从而导致过高的响应延迟,因此缓存应运而生.无论是单机缓存还是分布式缓存都有其适应场景和优缺点,当今存在的缓存产品也是数不胜数, ...
-
placeholder 兼容IE9以下版本 包含pasword
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
-
【HDOJ】3337 Guess the number
神一样的题目.简言之,利用手段获得测试用例的第一行,输出结果.很显然利用wa, TLE, OLE等judge status可以获得测试用例.因此,果断Python写一个acm提交机器人.依赖lxml库 ...
-
图论(网络流):UVa 1659 - Help Little Laura
Laura Luo has just invented a game. Given a beautiful pencil sketch with n points, you're to coloriz ...
-
Oracle的用户管理,授权及备份
一.用户进行授权的操作 创建用户:刚刚创建的用户并没有任何权限 CREATE USER 用户名 indentife BY 密码 授权: GRANT 权限1,权限2... TO 用户权限有:CREAT ...
-
centos6.5 x86_64安装oracle 11.2.0.3grid
centos6.5 x86_64安装oracle 11.2.0.3grid 1.安装前的准备 工作 1.1.配置node1 1.1.1.配置虚拟机并安装centos 安装node1----- 1 ...
-
Python module ---- abc
python中并没有提供抽象类与抽象方法,但是提供了内置模块abc(abstract base class)来模拟实现抽象类. ABC,Abstract Base Class(抽象基类),主要定义了 ...