本文为原创,转载请注明出处: cnzt  文章:cnzt-p

http://www.cnblogs.com/zt-blog/p/6709037.html 

一. 思路:

 <input type="file" accept="image/*" id="imgUpload" />

二. 原始效果:

 该标签在页面的原始效果如下(选择文件按钮),PC端点击会出现图片选择对话框。这里没有添加任何css代码,很丑。没关系,我们的案例中会做个漂亮一点点的~

  PC chrome(其他效果差不多):

  

  iOS safari:

  

  Android:

  并没有。。。。。。安卓手机

三. 兼容性:

 PC browsers -- 选择本地图片

 iOS -- 可以从图库选择或者拍照

 Android -- 可以选择图库或者文件管理。一句话,安卓之大,无奇不有,各种文件目录啊。。。

 补充20170421:安卓的拍照功能可以通过app端改变接口实现。

四. 用法:

  document.getElementById("imgUpload").onchange = function(e){
   console.log(e);
   var file = e.target.files[0];    console.log(file );
 }

 onchange -- input内容改变是触发,即重新选择新的文件。

 e -- onchange事件的参数,指向change事件,这里我们使用它的target属性。结构如下:

  

 file -- e.target.files[0] -- input标签中的文件对象,包含文件的修改时间,尺寸,类型及文件名,结构如下:

  

五. 上传图片:

 上传图片利用formdata,通过new Formdata(formdom)来获取formdata,结合ajax上传server

 //html代码
<form action="" id="formId">
<input type="file" name="image" accept="images/*" id="CameraUplBtn" capture="camera" />
</form> //js代码
var data = new FormData(document.getElementById("formId"));
$.ajax({
url: url_send,
headers: url_headers,
data: data,
type: "post",
contentType: false,
processData: false,
success: function(data){
//
},
error: function(data){
//
}
});

 注意:contentType: false, processData: false -- 这两个参数规定发送数据不用编码,禁止将data装换为请求字符串格式。

六. 案例(仿微信对话框的图片发送):

  1. 先上效果图,包括图片发送成功和失败的效果:

  

  2. 实现:

  2.1 页面布局

  前面说过了,file input默认样式很丑的,如何做成我们效果图上的样子呢,方法很多,我这里是将input设置宽高和透明度,以及将它定位到“图片”和“相机”的上层,超级简单无bug。

  2.2 事件绑定

  绑定onchange,该拿e拿e,该拿file拿file,见 第四点。

  2.3 图片添加到对话框

  我们采用data url的方式添加要发送的图片。怎么将img图片转成data url形式呢,方法也很多,我们用FileReader。上代码:

  

 var reader = new FileReader();
var imgDom;
var dataUrl;
reader.onload = function(e) {
imgItem = document.createElement('img');
dataUrl= e.target.result; //Android fix
if(isAndroid() && dataUrl.indexOf("data:image/") != 0){
dataUrl= dataUrl.replace("base64,", "image/" + file.type.split("/").pop()+ ";base64,");
} $(imgDom).attr('src',dataUrl); //拼接dom
var appendHTML = '<li class="me">'+
'<div class="c2"><span class="arrow"></span><span class="dialogText">'+
'<i data-id="'+file.name+'" class="uploading fa fa-spin fa-spinner"></i></span></div><div class="c1"></div></li>';
$("#dialogs").append(appendHTML);
imgItem.insertBefore($("i[data-id='"+file.name+"']")); //图片加载完后刷新iscroll
refreshScroll();
};
reader.readAsDataURL(file);

  创建一个FileReader对象,readAsDataURL()以data url方式读取文件,onload事件的参数load事件对象event.target.result即为文件的data url形式。然后在对话列表中增加一行,data url地址赋值给img的src,为了效果好一点,在图片旁边加上loading的圈圈,等图片上上传完成后去掉即可。

  这里对安卓的处理是参考百度反馈页面的fix,抱拳谢过~

  2.4 上传图片大server -- 见 第五点。

  2.5 错误处理

  如果图片上传失败,则在图片旁边添加小圆叹号图标,并给其绑定一个click/tap事件,点击重新上传图片。

本文完!

html页面中拍照和上传照片那些事儿(一)的更多相关文章

  1. html页面中拍照和上传照片那些事儿(二)

    本文为原创,转载请注明出处: cnzt       文章:cnzt-p http://www.cnblogs.com/zt-blog/p/6895352.html 本文主要说下iOS上传的照片在安卓机 ...

  2. 通过链接将JSP页面中一变量传到另一JSP界面中

    A.jsp 发送 <a herf="B.jsp?name=<%=name%>">传递到B页面</a> B.jsp  接收 <%String ...

  3. phonegap 拍照上传照片

    js代码 可以完全从  phonegap 官网扣下来 使用的是2.3版本的phonegap<script type="text/javascript" src="c ...

  4. 获取页面中更新删除传过来的id

    利用uri辅助函数 $id=$this->uri->segment(4); 其中segment(参数)  是表示你要截取获得第几个数据.

  5. 李洪强iOS开发之上传照片时英文改中文

    今天在做项目的时候,有一个功能是上传照片选择系统相册的照片,或者拍照上传照片,但是页面上的文字是英文的, 需求想改成中文的,解决方法是在 info.plist里面添加 Localized resour ...

  6. webuploader的一个页面多个上传按钮实例

    借鉴一位大佬的demo  附上他的github地址https://github.com/lishuqi 我把他的cxuploader.js改了不需要预览  直接上传图片后拿到回传地址给img标签显示图 ...

  7. 基于jQuery的ajax系列之用FormData实现页面无刷新上传

    接着上一篇ajax系列之用jQuery的ajax方法向服务器发出get和post请求写,这篇主要写如何利用ajax和FormData实现页面无刷新的文件上传效果,主要用到了jQuery的ajax()方 ...

  8. 用Seam实现:图片上传 + 保存到数据库 + 从数据库读出图片并显示到页面中

    上传图片并保存到数据库 seam给我们提供了 s:fileUpload 标签以完成文件上传功能.使用该标签时,要在web.xml中声明一个Seam的过滤器: <filter> <fi ...

  9. 使用PLupload在同一页面中进行多个不同类型上传解决方案和一次多文件上传的注意事项

    首先感谢,http://www.cnblogs.com/2050/p/3913184.html 这篇文章作者. 在使用PLUpload之前个人先封装了一些常用配置,并且将success与error做为 ...

随机推荐

  1. 用python+pygame写贪吃蛇小游戏

    因为python语法简单好上手,前两天在想能不能用python写个小游戏出来,就上网搜了一下发现了pygame这个写2D游戏的库.了解了两天再参考了一些资料就开始写贪吃蛇这个小游戏. 毕竟最开始的练手 ...

  2. Ubuntu 16.04 LTS: apt-get update 失败处理 Aborted (core dumped)

    在Ubuntu 16.04运行sudo apt-get update出现如下错误: rogn@ubuntu:~$ sudo apt-get update Get:1 http://us.archive ...

  3. Python matlab octave 矩阵运算基础

    基础总结,分别在三种软件下,计算 求逆矩阵 矩阵转置 等运算,比较异同 例子:正规方程法求多元线性回归的最优解 θ=(XTX)-1XTY octave: pwd()当前目录 ones() zeros( ...

  4. QT_7_资源文件_对话框_QMessageBox_界面布局_常用控件

    资源文件 1.1. 将资源导入到项目下 1.2. 添加文件—>Qt -->Qt Resource File 1.3. 起名称 res ,生成res.qrc文件 1.4. 右键 open i ...

  5. java缓存的使用

    缓存1,缓存的定义与作用2,缓存的使用范围(命中率高.高访问量)3,缓存策略(命中率,最大元素,清空策略);4,缓存介质(内存缓存,硬盘缓存,数据库缓存)(本地缓存(ehcache,oscache)与 ...

  6. Gym-101615C-Fear Factoring(数论)

    分析 题意是求 L - R之间的数的因数和 我们知道如果对于一个数 i ( i < k = sqrt(R)),那么一定有一个数 R/i 也是R的因数 遍历 i = 2 - k,然后对于每一个 i ...

  7. 4. COLLATION_CHARACTER_SET_APPLICABILITY

    4. COLLATION_CHARACTER_SET_APPLICABILITY 表COLLATION_CHARACTER_SET_APPLICABILITY表示哪种字符集适用于哪种排序规则. INF ...

  8. 条款7:为多太基类声明virtual析构函数

    NOTE: 1.polymorphic(多态性质的)base classes 应该声明一个virtual 析构函数.如果class带有任何virtual函数,它就应该拥有一个virtual析构函数. ...

  9. 【实验吧】转瞬即逝write up

    ---恢复内容开始--- 虽然这是很简单的一道题,但这是我第一次拿着题有很清晰的思路,并且脚本也有思路写,拿到文件用ida打开,分析main函数: int __cdecl main(int argc, ...

  10. java.sql.SQLException: Data truncated for column 'lastSeason' at row 1

    在使用项目将数据存储到 datetime 的字段 ,抛出了这个异常 而我是使用Java.util.Date 存储过去的 解决代码如下: Date date = new Date(); demo.set ...