h5 input file ajax实现文件上传
<input type="file" accept="image/*" height="0" class="file_input" id="file_input_ss_0" multiple> 文件域
遇到的几个BUG 已经解决
1 多选文件域,如果没有上传成功或已上传成功,再次点击文件域名选择图片时,会累积上次的文件。
例如 第一次上传1.jpg 第二次点击上传 2.jpg 第二次的上传结果为1.jpg 2.jpg 上传了两张。
解决此问题思路:
1 在网上查了很多关于清除file文件域的办法,都不起作用/
2 最终用了删除直接的file文件域 重新创建一个file文件域 重新绑定事件,重复上传文件解决。
/**
* 初始化图片上传文件
*/
function init_list_imgs(){
if(!(window.FileReader && window.File && window.FileList && window.Blob)){
$.alert('您的浏览器不支持fileReader');
return false;
}
add_imgs();
} /**
* 动态添加的图片上传
*/
function add_imgs(){
imgs_div_html = '\
<li id="img_nav">\
<div class="item-content">\
<div class="item-media">\
<i class="icon icon-form-name"></i>\
</div>\
<div class="item-inner">\
<div class="item-title label">外观</div>\
<div class="item-input">\
<span class="icon icon-down" id="direct_ico" style="float: right"></span>\
<div style="clear: both;"></div>\
</div>\
</div>\
</div>\
</li>\
<li class="li_imgs" style="display:none">\
<div class="imgs">\
<input type="file" accept="image/*" height="0" class="file_input" id="file_input_ss_0" multiple>\
<span></span>\
</div>\
</li>';
$('#wash_car_mem').after(imgs_div_html);
//点击 外观 事件
img_nav();
//绑定 事件
bind_event();
} /**
* 首次
*/
function bind_event(){
var file_input = $('.li_imgs').children('.imgs').last().children().first();
file_input_change(file_input);
} /**
* 区分 Ios android 绑定 文件上传事件
*/
function file_input_change(file_input){ file_input.next('span').on('click',function(){
$('#file_input_ss_'+file_input_id).click().trigger();
}); file_input.on('click',function(){
$(this).attr('disabled');
var u = navigator.userAgent;
if (u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) { //安卓手机
// 调安卓接口,调拍照和相册的弹窗
window.androidJsInterface.obtainFile();
} else {
ios_bind_change(file_input);
}
});
}
/**
* IOS 文件上传事件绑定
*/
function ios_bind_change(file_input){
file_input.on('change',function(){
//单通道
if(_deny_request){
remove_file_input($(this))
return;
}
_deny_request = true;
//载入动画
$.showPreloader(_up_img_msg);
if(!this.files.length){
$('.li_imgs').children('.imgs').last().children().first().removeAttr('disabled');
$.hidePreloader();
_deny_request = false;
return; }else if(this.files.length > 6){
$.hidePreloader();
$.alert('一次最多只能选择6张图片哦',function(){_deny_request = false;$('.li_imgs').children('.imgs').last().children().first().removeAttr('disabled');remove_file_input($(this));});
return;
}else{
var s = check_file(this.files);
remove_file_input($(this));
}
});
} /**
* 删除文件上传域 解决部分机型重复上传问题
*/
function remove_file_input(file_input){
file_input.remove();
++file_input_id;
$('.li_imgs').children('.imgs').last().children('span').before('<input type="file" accept="image/*" height="0" class="file_input" id="file_input_ss_'+file_input_id+'" multiple>');
file_input_change($('#file_input_ss_'+file_input_id));
} /**
* IOS 图片上传
*/
function check_file(files){
//校验收集表单数据
var formdata = new FormData();
var bad_files = 0;
for(var i=0; i<files.length;i++){
if(/image\/\w+/.test(files[i].type)){
formdata.append("imgFile"+i, files[i]);
}else{
bad_files++;
}
}
if(bad_files >= files.length){
$.hidePreloader();
$('.li_imgs').children('.imgs').last().children().first().removeAttr('disabled');
_deny_request = false;
return;
}
//提交
$.ajax({
type: "POST",
dataType: "json",
contentType: false,
cache : false,
processData : false,
async: true,
url: '?c=bzymgr/washcar&a=add_imgs&openid=<?php echo $this->openid;?>',
data:formdata,
success: function (res) {
if(res=='0'){
public_toast('照片上传失败,请稍后重试',1000);
return;
}
var html = '';
for(var i in res){
html += '<div class="imgs">\
<img src="'+res[i]+'" class="thumb_img"/>\
<b class="img_cancel" onclick="remove_img(this)">X</b>\
</div>';
//存储到localStorage
add_imgs_LocalStorage(res[i]);
}
//插入dom
$('.li_imgs').children('.imgs').last().before(html);
setTimeout(function(){
$.hidePreloader();
$('.li_imgs').children('.imgs').last().children().first().removeAttr('disabled');
_deny_request = false;
},1000);
return;
},
error:function(){
public_toast('服务器离家出走了,请稍后重试',2000);
return;
},
});
} /**
* 删除 已上传图片
* 只删除本地 服务器不删除
*/
function remove_img(obj){
$.confirm('确认要删除这张图片吗?',function(){
pop_imgs_LocalStorage($(obj).prev('img').attr('src'));
$(obj).parent().remove();
return;
});
}
以上代码在IOS 9.3.1 中用 Input file 可以调用出 相册和相机
但是在IOS 8.4版本中,就直接访问相册了。 目前还没有好找到好的解决办法。
h5 input file ajax实现文件上传的更多相关文章
- input file美化,文件上传
此文学习至:http://www.haorooms.com/post/input_file_leixing 然而只会用,不会做,UI泪茫茫 效果图: 原图: 美化后: 此主要用css美化表单,然后用J ...
- vue项目内嵌入到app input type=file 坑(文件上传插件)
w问题描述: 我用vue-cli完成的一个移动端项目,内嵌到app当中,用原生的input type=file 来完成文件上传.在安卓下没有问题但是在苹果手机 上传第二次手机就会发生白屏 并无缘无故跳 ...
- ajax提交表单、ajax实现文件上传
ajax提交表单.ajax实现文件上传,有需要的朋友可以参考下. 方式一:利用from表单的targer属性 + 隐藏的iframe 达到类似效果, 支持提交含有文件和普通数据的复杂表单 方式二:使用 ...
- Ajax 与文件上传
一 Ajax篇 1 ajax简介(Asynchronous Javascript And XML) 异步,Js,XML,即使用Javascript语言与服务器进行异步交互,传输的数据为xml(可扩展标 ...
- 基于 Django的Ajax实现 文件上传
---------------------------------------------------------------遇到困难的时候,勇敢一点,找同学朋友帮忙,找导师求助. Ajax Ajax ...
- ajax与文件上传
一.ajax ajax(Asynchronous JavaScript And XML):异步JavaScript和XML,即使用JavaScript语句与服务器进行异步交互,传输的数据为XML(也可 ...
- python 全栈开发,Day75(Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件)
昨日内容回顾 基于对象的跨表查询 正向查询:关联属性在A表中,所以A对象找关联B表数据,正向查询 反向查询:关联属性在A表中,所以B对象找A对象,反向查询 一对多: 按字段:xx book ----- ...
- python django + js 使用ajax进行文件上传并获取上传进度案例
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Django学习笔记之Ajax与文件上传
Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输 ...
随机推荐
- SlickGrid example 3b: 支持撤销操作的编辑单元
不同类型的属性可以按不同的风格编辑. 每个编辑单元可以设置不同的验证方法. 历史编辑可以撤销. 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD HTM ...
- java文件写入和读出的序列化
文件的写入入与读出都有它们自己的格式,不便于读入和取出,implement Serializable接口,实现任何个事文件的写入和读取取:
- vsftp 使用匿名帐号登陆
1.正常安装. 2.改配置文件:vi /etc/vsftpd/vsftpd.conf #允许匿名用户登录FTP anonymous_enable=YES #设置匿名用户的登录目录(如需要,需自己添加并 ...
- mysql replication之binlog-do-db、binlog-ignore-db
再次整理管理mysql复制的资料,一直搞不明白为什么mysql的启动参数里面有两个binlog-do-db.binlog-ignore-db 这次仔细的阅读了mysql的帮助手册,整理一下对于一条语句 ...
- mongodb(4查询)
第一个参数决定要返回那些文档 db.test.find()返回所有文档 db.test.find({"age":27}) db.test.find({"username& ...
- WDCP控制面板如何安装PDO_mysql组件
http://osacar.iteye.com/blog/2098431 执行wget -c http://down.wdlinux.cn/in/pdo_mysql_ins.sh再执行chmod 75 ...
- SqlSever基础 cast 将getdate返回的时间转换成字符串
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- BZOJ 2668 交换棋子(费用流)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2668 题意:有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子中的棋子,最终达到目标状 ...
- BZOJ 1835 基站选址(线段树优化DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1835 题意:有N个村庄坐落在一条直线上,第 i(i>1)个村庄距离第1个村庄的距离 ...
- Dungeon Master bfs
time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u POJ 2251 Descriptio ...