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版本中,就直接访问相册了。 目前还没有好找到好的解决办法。

原文地址:https://www.cnblogs.com/onephp/p/5485065.html