最近的工作中,遇到了一个需求:对于无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. mysql优化方案之sql优化

    优化目标 1.减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先 ...

  2. 网络请求(I)

    NSURLSession 代理方法 有的时候,我们可能需要监听网络请求的过程(如下载文件需监听文件下载进度),那么就需要用到代理方法. #import "ViewController.h&q ...

  3. 【Spark-core学习之四】 Spark任务提交

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  4. ili9325--LCD寄存器配置研究

    2011-06-22 22:18:12 自己根据ili9325的规格书编写驱动.发现LCD屏没显示.于是怀疑是某些寄存器设置错误.要调试的话最好还是先熟悉寄存器的作用,调试的时候只要看到现象就能分析了 ...

  5. Android项目第一天,下载安装Android Studio和“我的第一个安卓项目”

    一.AS的下载我是在AS官方网站进行下载的最新版本,如图所示 二.AS的安装过程 点击你下载的安装包安装即可,傻瓜式一站到底. 到这一步时选择第二个按钮, 随后出现如下界面 这个窗口是提示我们设置代理 ...

  6. Python 匿名变量

    匿名变量的使用 calc = lambda x:x*3 print(calc(3)) 注:匿名变量是没有名字的变量 注:使用:lambda 创建.

  7. 02:openf-falcon安装

    open-falcon其他篇 目录: 1.1 安装open-falcon环境准备 1.2 部署open-falcon后端 1.2.1 agent配置文件 1.2.2 transfer(数据上报) 1. ...

  8. MyBatis进阶(一)

    MyBatis参数传递 1. MyBatis单参数传递 单参数传递不做特殊处理,直接取出参数值赋给xml文件,如#{id} 2. MyBatis多参数传递 多参数传递默认使用{arg1, arg0, ...

  9. ASP.NET图片上传(配合jquery.from.js 插件)

    前端: js:        function AjaxKouBeiShopEdit() { var options = {                dataType: "json&q ...

  10. Asp.net core 学习笔记 SignalR

    refer : https://kimsereyblog.blogspot.com/2018/07/signalr-with-asp-net-core.html https://github.com/ ...