zoukankan      html  css  js  c++  java
  • 阿里巴巴文件异步上传

    /*******************************************************************************
    * 异步上传文件,兼容IE8,火狐和谷歌可用,如果支持h5则使用h5
    * 实现单个多次上传不刷新
    * @author 柳伟伟 <702295399@qq.com>
    * @version 1.6 (2016-09-27) 修整代码
    *******************************************************************************/
    (function ($) {
        var log=function(str){
            if(window.console){
                console.log(str);
            }
        }
        var frameCount = 0;
        var formName = "";
        var iframeObj = null;
        var state = {};
        var colfile = null;
        //清空值
        function clean(target) {
            var file = $(target);
            var col = file.clone(true).val("");
            file.after(col);
            file.remove();
            //关键说明
            //先得到当前的对象和参数,接着进行克隆(同时克隆事件)
            //将克隆好的副本放在原先的之后,按照顺序逐个删除,最后初始化克隆的副本
        };
        function h5Submit(target) {
            var options = state.options;
            var fileObj = target[0].files[0];
            var fd = new FormData();//h5对象
            //附加参数
            for (key in options.params) {
                fd.append(key, options.params[key])
            }
            var fileName = target.attr('name');
            if (fileName == ''
                || fileName == undefined) {
                fileName = 'file';
            }
            fd.append(fileName, fileObj);
            //异步上传
            var xhr = new XMLHttpRequest();
            xhr.upload.addEventListener("progress", function (evt) {
                if (evt.lengthComputable) {
                    var percentComplete = Math.round(evt.loaded * 100 / evt.total);
                    log(percentComplete + "%");
                    if (options.onProgress) {
                        options.onProgress(evt);
                    }
                }
            }, false);
            xhr.addEventListener("load", function (evt) {
                if ('json' == options.dataType) {
                    var d = window.eval('(' + evt.target.responseText + ')');
                    options.onComplate(d);
                } else {
                    options.onComplate(evt.target.responseText);
                }
            }, false);
            xhr.addEventListener("error", function () {
                log("error");
            }, false);
            xhr.open("POST", options.url);
            xhr.send(fd);
        }
        function ajaxSubmit(target) {
            var options = state.options;
            if (options.url == '' || options.url == null) {
                alert("无上传地址");
                return;
            }
            if ($(target).val() == '' || $(target).val() == null) {
                alert("请选择文件");
                return;
            }
            var canSend = options.onSend($(target), $(target).val());
            if (!canSend) {
                return;
            }
            /*判断是否可以用h5*/
            if (window.FormData) {
                //h5
                h5Submit(target);
            } else {
                /**/
                if (iframeObj == null) {
                    var frameName = 'upload_frame_' + (frameCount++);
                    var iframe = $('<iframe style="position:absolute;top:-9999px" ><script type="text/javascript"></script></iframe>').attr('name', frameName);
                    formName = 'form_' + frameName;
                    var form = $('<form method="post" style="display:none;" enctype="multipart/form-data" />').attr('name', formName);
                    form.attr("target", frameName).attr('action', options.url);
                    var fileHtml = $(target).prop("outerHTML");
                    colfile = $(target).clone(true);
                    $(target).replaceWith(colfile);
                    var formHtml = "";
                    // form中增加数据域
                    for (key in options.params) {
                        formHtml += '<input type="hidden" name="' + key + '" value="' + options.params[key] + '">';
                    }
                    form.append(formHtml);
                    form.append(target);
                    iframe.appendTo("body");
                    form.appendTo("body");
                    iframeObj = iframe;
                }
                //禁用
                $(colfile).attr("disabled", "disabled");
                var form = $("form[name=" + formName + "]");
                //加载事件
                iframeObj.bind("load", function (e) {
                    var contents = $(this).contents().get(0);
                    var data = $(contents).find('body').text();
                    if ('json' == options.dataType) {
                        try {
                            data = window.eval('(' + data + ')');
                        }
                        catch (Eobject) {
                            log(Eobject);
                            data = null;
                        }
                    }
                    options.onComplate(data);
                    iframeObj.remove();
                    form.remove();
                    iframeObj = null;
                    //启用
                    $(colfile).removeAttr("disabled");
                });
                try {
                    form.submit();
                } catch (Eobject) {
                    log(Eobject);
                }
            }
        };
        //构造
        $.fn.upload = function (options) {
            if (typeof options == "string") {
                return $.fn.upload.methods[options](this);
            }
            options = options || {};
            state = $.data(this, "upload");
            if (state)
                $.extend(state.options, options);
            else {
                state = $.data(this, "upload", {
                    options: $.extend({}, $.fn.upload.defaults, options)
                });
            }
        };
        //方法
        $.fn.upload.methods = {
            clean: function (jq) {//清空
                return jq.each(function () {
                    clean(jq);
                });
            },
            ajaxSubmit: function (jq) {//提交
                return jq.each(function () {
                    ajaxSubmit(jq);
                });
            },
            getFileVal: function (jq) {//获取值
                return jq.val()
            }
        };
        //默认项
        $.fn.upload.defaults = $.extend({}, {
            url: '',
            dataType: 'json',
            params: {},
            onSend: function (obj, str) { return true; },
            onComplate: function (e) {},
            onProgress: function (e) {}
        });
    })(jQuery);
       
    前段页面
    css样式
     .sl-custom-file{  
            position:relative;  
            display:inline-block;  
            zoom:1;  
            cursor:pointer;  
            overflow:hidden;  
            vertical-align:middle;  
        }  
     .ui-input-file{  
         position:absolute;  
         right:0;  
         top:0;  
         _zoom:30;  
         font-size:300px9;  
         height:100%;  
         _height:auto;  
         opacity:0;  
         filter:alpha(opacity=0);  
         -ms-filter:"alpha(opacity=0)";  
         cursor:pointer;  
     }
    html页面
    <span class="sl-custom-file">  
        <input type="button" name="" value="上传附件" id="btn1"/>  
        <input type="file" name="file" class="ui-input-file" id="ppSendphoto" onchange="fileOnchange();"/>  
    </span>
    js代码:
    function fileOnchange(){
    //表单提交
      $("input[name=test]").upload({
            url: '路径',
            // 其他表单数据
            params: { name: 'pxblog' },
            // 上传完成后, 返回json, text
            dataType: 'json',
            onSend: function (obj, str) {  return true; },
            // 上传之后回调
            onComplate: function (data) {
                alert(data.file);
            }
        });
        $("input[name=test]").upload("ajaxSubmit");
    //每次onchange时间只有点击第一次时生效,所以每次都要删除file再重新生成
        $(".ui-input-file").remove();
        var  content= '<input type="file" name="file" class="ui-input-file" id="ppSendphoto" alt="en" onchange="fileOnchange();" style="position:absolute;right:0;top:0;_zoom:30;font-size:300px9;height:100%;height:auto;opacity:0;filter:alpha(opacity=0);-ms-filter:"alpha(opacity=0)";cursor:pointer;  
    "/> ';
        $("#ppSendphoto1").after(content);
    }
    //在IE8下返回会触发安全模式,设置返回类型
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html; charset=utf-8");
    注:file遮罩后无法触发二次点击。火狐谷歌使用完全正常,可以将file隐藏,通过onclick点击事件触发file点击功能

  • 相关阅读:
    return break continue
    Web 前端攻防(2014版)
    mysql语句
    MD5加密
    array_pop()将数组最后一个单元弹出(出栈)
    定义一个求和函数
    机器学习:偏差方差权衡(Bias Variance Trade off)
    机器学习:验证数据集与交叉验证
    机器学习:学习曲线
    机器学习:过拟合与欠拟合
  • 原文地址:https://www.cnblogs.com/god-monk/p/6394847.html
Copyright © 2011-2022 走看看