应用的平台环境:安卓webview;

涉及的技术点:

(1) <input type="file" > :在开发中,安卓webview默认点击无法调用文件选择与相机拍照(其他的设备ios等浏览器没有此问题),需要让安卓开发同学在代码调整即可;

(2) 点击选择图片后如何展示在页面上呢?很多开发人员估计是直接获取 this.value,这是错误的,不可行。有2个API可以现实,new FileReader与window.URL.createObjectURL(最优);

  new FileReader的实现如下:

 <input type="file" name="" id="j-file">
<img src="" id='j-img' alt="" width="100%">
<button id='j-btn'>upload</button>
<script type="text/javascript">
var o_file = document.getElementById('j-file'),
o_btn = document.getElementById('j-btn'),
o_img = document.getElementById('j-img'); o_file.addEventListener('change',function(event){
var file = event.target.files[0];
if(!file) return; var reader = new FileReader();
if(/image/.test(file.type)){
reader.readAsDataURL(file); //读取
}else{
console.log('请选择图片');
} reader.onload = function(){
o_img.setAttribute('src',reader.result);// 获取地址
} },false);
</script>

在安卓webview实战中,读取与写入速度相当慢,不推荐;

//-----------------------------------------------------------------------------------------

window.URL.createObjectURL实现如下:

<input type="file" name="" id="j-file">
<img src="" id='j-img' alt="" width="100%">
<button id='j-btn'>upload</button>
<script type="text/javascript">
var o_file = document.getElementById('j-file'),
o_btn = document.getElementById('j-btn'),
o_img = document.getElementById('j-img'); o_file.addEventListener('change',function(event){
var file = event.target.files[0];
if(!file) return;
var url = window.URL.createObjectURL(file);
if(/image/.test(file.type)){
o_img.setAttribute('src',url);
}else{
console.log('请选择图片');
}
},false); o_btn.onclick = function(){
var data = new FormData();
data.append('file_a',o_file.files[0]);
data.append('text','test');
console.log(data);
}
</script>

这技术的好处是可以不必把文件内容读取到javascript中,而是直接使用文件内容,速度很快;

(3)如何讲图片数据通过XHR对象传递给服务端呢?new FormData(),为序列化表单以及创建与表单格式相同的数据(XHR传输)提供了实现,FormData不必明确在xhr对象上设置请求头部(如果是表单里面图片上传,enctype需要设置multipart/form-data),XHR能自动识别,实例方法.append(key,value)自定义数据;

完整的代码例子如下:

<input type="file" name="" id="j-file">
<img src="" id='j-img' alt="" width="100%">
<button id='j-btn'>upload</button>
<script type="text/javascript">
var o_file = document.getElementById('j-file'),
o_btn = document.getElementById('j-btn'),
o_img = document.getElementById('j-img'),
target_file = null; o_file.addEventListener('change',function(event){
var file = event.target.files[0];
if(!file) return;
target_file = file;
var url = window.URL.createObjectURL(target_file);
if(/image/.test(target_file.type)){
o_img.setAttribute('src',url);
}else{
console.log('请选择图片');
}
},false); o_btn.onclick = function(){
if(!target_file) return;
//数据处理
var data = new FormData();
data.append('key',target_file); var xhr = new XMLHttpRequest(); if(xhr.upload){
xhr.upload.addEventListener("progress", function(e){
var loaded = e.loaded; //已经上传大小情况
var tot = e.total; //附件总大小
var per = Math.floor(100*loaded/tot); //已经上传的百分比
console.log(per+'%');//进度
}, false);
} xhr.onreadystatechange = function(e) {
if (xhr.readyState == 4) {
if (xhr.status >=200&&xhr.status<300||xhr.status==304) {
//上传成功
}
}
};
xhr.onloadend = function(){
//无论失败或成功
}
xhr.onerror = function(){
//网络失败
}
// 开始上传
xhr.open("POST",'上传地址', true);
xhr.send(data);
}
</script>

hybird app项目实例:安卓webview中HTML5拍照图片上传的更多相关文章

  1. Aps.net中基于bootstrapt图片上传插件的应用

    Aps.net中基于bootstrapt图片上传插件的应用 在最近的项目中需要使用一个图片上传的功能,而且是多张图片同时上传到服务器的文件夹中,将图片路径存放在数据库中.为了外观好看使用了bootst ...

  2. MVC4中基于bootstrap和HTML5的图片上传Jquery自定义控件

    场景:mvc4中上传图片,批量上传,上传前浏览,操作.图片进度条. 解决:自定义jquery控件 没有解决:非图片上传时,会有浏览样式的问题; 解决方案; 1.样式 – bootstrap 的css和 ...

  3. iOS 开发之路(WKWebView内嵌HTML5之图片上传) 五

    HTML5页面的图片上传功能在iOS端的实现. 首先,页面上用的是plupload组件,在wkwebview上存在两个坑需要修复才能正常使用. 问题:在webview上点击选择照片/相机拍摄,就会出现 ...

  4. android选择图片或拍照图片上传到服务器(包括上传参数)

    From:http://blog.csdn.net/springsky_/article/details/8213898具体上传代码: 1.选择图片和上传界面,包括上传完成和异常的回调监听 [java ...

  5. android选择图片或拍照图片上传到server(包含上传參数)

    在9ria论坛看到的.还没測试,先Mark与大家分享一下. 近期要搞一个项目,须要上传相冊和拍照的图片.不负所望,最终完毕了! 只是须要说明一下,事实上网上非常多教程拍照的图片.都是缩略图不是非常清晰 ...

  6. 从web编辑器 UEditor 中单独提取图片上传,包含多图片单图片上传以及在线涂鸦功能

    UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码.(抄的...) UEditor是非常好用的富文 ...

  7. Django中怎么做图片上传--图片展示

    1.首先是html页面的form表单的三大属性,action是提交到哪,method是提交方式,enctype只要有图片上传就要加这个属性 Django框架自带csrf_token ,所以需要在前端页 ...

  8. ssm项目中KindEditor的图片上传插件,浏览器兼容性问题

    解决办法: 原因:使用@ResponseBody注解返回java对象,在浏览器中是Content-Type:application/json;charset=UTF-8 我们需要返回字符串(Strin ...

  9. Hbuilder mui 相册拍照图片上传

    http://www.bcty365.com/content-146-3648-1.html 使用流程 弹出actionSheet /*点击头像触发*/ document.getElementById ...

随机推荐

  1. 苹果推送通知服务APNs编程(转)

    add by zhj: 下面的几篇文章也非常好, http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios- ...

  2. android 获取经纬度

    android 定位的两种方式:GPS_PROVIDER and NETWORK_PROVIDER 定位的可以借助LocationManager来实现 MainActivity代码 static fi ...

  3. TCP三次握手和四次挥手详解

    背景描述通过上一篇中网络模型中的IP层的介绍,我们知道网络层,可以实现两个主机之间的通信.但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进程在交 ...

  4. 零碎收集cocos知识

    Configuration类 返回环境变量 local function menuCallback(tag, pSender) printInfo("selected item tag:%d ...

  5. 20155203 2016-2017-4 《Java程序设计》第8周学习总结

    20155203 2016-2017-4 <Java程序设计>第8周学习总结 教材学习内容总结 1.channel的继承架构 2.position()类似于堆栈操作中的栈顶指针. 3.Pa ...

  6. 计算机bit是什么意思

    bit是计算机中数据的最小单位,即二进制位,数字0和1 一个字节是八位(8个0和1 或 1 组成的一串二进制) 一个字是16位,等于2个字节 用八位二进制表示的字符叫单字节字符, 用16位二进制数表示 ...

  7. 使用U盘安装linux系统

    1. 下载并安装:UltraISO.流氓软件太多,最后是在百度软件中心下的,推荐. 2. 插入U盘.打开UltraISO,然后:文件 -- 打开 -- 选择你的ISO文件,打开. 3. UltraIS ...

  8. word 杂记

    45.error和exception有什么区别? 答案:Error表示系统级的错误和程序不必处理的异常,我们无法处理它. Exception表示是可以捕捉或者需要程序进行处理的异常. 47.abstr ...

  9. FFmpeg 入门(7):Seeking

    本文转自:FFmpeg 入门(7):Seeking | www.samirchen.com 处理 seek 命令 我们将为播放器添加 seek 的能力.这个过程中,我们会看到 av_seek_fram ...

  10. Core Java 4

    p272~p273 1.除捕获异常外的另一种异常处理方式:将异常继续传递给方法调用者. 即:在方法首部添加throws说明符号,取代 try catch语句. 对于方法的调用者而言:要么处理异常,要么 ...