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

  • 相关阅读:
    RedGlove 权限管理系统(1)权限概述
    SPQuery查询语法简要说明
    DataGridView使用技巧大全
    实战asp.net MVC+ADO.NET EntityFramework
    RedGlove 权限管理系统(2)功能模块设计
    C# 如果何从线程中操作控件
    PageHelper 类 和 ValidateHelper 类
    字符串帮助类
    XMLHelper 类
    Android中截取当前屏幕的功能
  • 原文地址:https://www.cnblogs.com/onephp/p/5485065.html
Copyright © 2020-2023  润新知