upload.js 11.9 KB
/** layui-v2.3.0 MIT License By https://www.layui.com */
;
layui.define("layer",
function(e) {
    "use strict";
    var i = layui.$,
    t = layui.layer,
    n = layui.hint(),
    a = layui.device(),
    o = {
        config: {},
        set: function(e) {
            var t = this;
            return t.config = i.extend({},
            t.config, e),
            t
        },
        on: function(e, i) {
            return layui.onevent.call(this, r, e, i)
        }
    },
    l = function() {
        var e = this;
        return {
            upload: function(i) {
                e.upload.call(e, i)
            },
            config: e.config
        }
    },
    r = "upload",
    u = "layui-upload-file",
    c = "layui-upload-form",
    f = "layui-upload-iframe",
    s = "layui-upload-choose",
    p = function(e) {
        var t = this;
        t.config = i.extend({},
        t.config, o.config, e),
        t.render()
    };
    p.prototype.config = {
        accept: "images",
        exts: "",
        auto: !0,
        bindAction: "",
        url: "",
        field: "file",
        method: "post",
        data: {},
        drag: !0,
        size: 0,
        number: 0,
        multiple: !1
    },
    p.prototype.render = function(e) {
        var t = this,
        e = t.config;
        e.elem = i(e.elem),
        e.bindAction = i(e.bindAction),
        t.file(),
        t.events()
    },
    p.prototype.file = function() {
        var e = this,
        t = e.config,
        n = e.elemFile = i(['<input class="' + u + '" type="file" accept="' + t.acceptMime + '" name="' + t.field + '"', t.multiple ? " multiple": "", ">"].join("")),
        o = t.elem.next(); (o.hasClass(u) || o.hasClass(c)) && o.remove(),
        a.ie && a.ie < 10 && t.elem.wrap('<div class="layui-upload-wrap"></div>'),
        e.isFile() ? (e.elemFile = t.elem, t.field = t.elem[0].name) : t.elem.after(n),
        a.ie && a.ie < 10 && e.initIE()
    },
    p.prototype.initIE = function() {
        var e = this,
        t = e.config,
        n = i('<iframe id="' + f + '" class="' + f + '" name="' + f + '" frameborder="0"></iframe>'),
        a = i(['<form target="' + f + '" class="' + c + '" method="' + t.method, '" key="set-mine" enctype="multipart/form-data" action="' + t.url + '">', "</form>"].join(""));
        i("#" + f)[0] || i("body").append(n),
        t.elem.next().hasClass(c) || (e.elemFile.wrap(a), t.elem.next("." + c).append(function() {
            var e = [];
            return layui.each(t.data,
            function(i, t) {
                t = "function" == typeof t ? t() : t,
                e.push('<input type="hidden" name="' + i + '" value="' + t + '">')
            }),
            e.join("")
        } ()))
    },
    p.prototype.msg = function(e) {
        return t.msg(e, {
            icon: 2,
            shift: 6
        })
    },
    p.prototype.isFile = function() {
        var e = this.config.elem[0];
        if (e) return "input" === e.tagName.toLocaleLowerCase() && "file" === e.type
    },
    p.prototype.preview = function(e) {
        var i = this;
        window.FileReader && layui.each(i.chooseFiles,
        function(i, t) {
            var n = new FileReader;
            n.readAsDataURL(t),
            n.onload = function() {
                e && e(i, t, this.result)
            }
        })
    },
    p.prototype.upload = function(e, t) {
        var n, o = this,
        l = o.config,
        r = o.elemFile[0],
        u = function() {
            var t = 0,
            n = 0,
            a = e || o.files || o.chooseFiles || r.files,
            u = function() {
                l.multiple && t + n === o.fileLength && "function" == typeof l.allDone && l.allDone({
                    total: o.fileLength,
                    successful: t,
                    aborted: n
                })
            };
            layui.each(a,
            function(e, a) {
                var r = new FormData;
                r.append(l.field, a),
                layui.each(l.data,
                function(e, i) {
                    i = "function" == typeof i ? i() : i,
                    r.append(e, i)
                }),
                i.ajax({
                    url: l.url,
                    type: l.method,
                    data: r,
                    contentType: !1,
                    processData: !1,
                    dataType: "json",
                    headers: l.headers || {},
                    success: function(i) {
                        t++,
                        d(e, i),
                        u()
                    },
                    error: function() {
                        n++,
                        o.msg("请求上传接口出现异常"),
                        m(e),
                        u()
                    }
                })
            })
        },
        c = function() {
            var e = i("#" + f);
            o.elemFile.parent().submit(),
            clearInterval(p.timer),
            p.timer = setInterval(function() {
                var i, t = e.contents().find("body");
                try {
                    i = t.text()
                } catch(n) {
                    o.msg("获取上传后的响应信息出现异常"),
                    clearInterval(p.timer),
                    m()
                }
                i && (clearInterval(p.timer), t.html(""), d(0, i))
            },
            30)
        },
        d = function(e, i) {
            if (o.elemFile.next("." + s).remove(), r.value = "", "object" != typeof i) try {
                i = JSON.parse(i)
            } catch(t) {
                return i = {},
                o.msg("请对上传接口返回有效JSON")
            }
            "function" == typeof l.done && l.done(i, e || 0,
            function(e) {
                o.upload(e)
            })
        },
        m = function(e) {
            l.auto && (r.value = ""),
            "function" == typeof l.error && l.error(e || 0,
            function(e) {
                o.upload(e)
            })
        },
        h = l.exts,
        v = function() {
            var i = [];
            return layui.each(e || o.chooseFiles,
            function(e, t) {
                i.push(t.name)
            }),
            i
        } (),
        g = {
            preview: function(e) {
                o.preview(e)
            },
            upload: function(e, i) {
                var t = {};
                t[e] = i,
                o.upload(t)
            },
            pushFile: function() {
                return o.files = o.files || {},
                layui.each(o.chooseFiles,
                function(e, i) {
                    o.files[e] = i
                }),
                o.files
            },
            resetFile: function(e, i, t) {
                var n = new File([i], t);
                o.files = o.files || {},
                o.files[e] = n
            }
        },
        y = function() {
            if ("choose" !== t && !l.auto || (l.choose && l.choose(g), "choose" !== t)) return l.before && l.before(g),
            a.ie ? a.ie > 9 ? u() : c() : void u()
        };
        if (v = 0 === v.length ? r.value.match(/[^\/\\]+\..+/g) || [] || "": v, 0 !== v.length) {
            switch (l.accept) {
            case "file":
                if (h && !RegExp("\\w\\.(" + h + ")$", "i").test(escape(v))) return o.msg("选择的文件中包含不支持的格式"),
                r.value = "";
                break;
            case "video":
                if (!RegExp("\\w\\.(" + (h || "avi|wma|rmvb|rm|flash|3gp|flv") + ")$", "i").test(escape(v))) return o.msg("选择的视频中包含不支持的格式"),
                r.value = "";
                break;
            case "audio":
                if (!RegExp("\\w\\.(" + (h || "mp3|wav|mid") + ")$", "i").test(escape(v))) return o.msg("选择的音频中包含不支持的格式"),
                r.value = "";
                break;
            default:
                if (layui.each(v,
                function(e, i) {
                    RegExp("\\w\\.(" + (h || "apk|mp4|jpg|png|gif|bmp|jpeg$") + ")", "i").test(escape(i)) || (n = !0)
                }), n) return o.msg("选择的图片中包含不支持的格式"),
                r.value = ""
            }
            if (o.fileLength = function() {
                var i = 0,
                t = e || o.files || o.chooseFiles || r.files;
                return layui.each(t,
                function() {
                    i++
                }),
                i
            } (), l.number && o.fileLength > l.number) return o.msg("同时最多只能上传的数量为:" + l.number);
            if (l.size > 0 && !(a.ie && a.ie < 10)) {
                var F;
                if (layui.each(o.chooseFiles,
                function(e, i) {
                    if (i.size > 1024 * l.size) {
                        var t = l.size / 1024;
                        t = t >= 1 ? t.toFixed(2) + "MB": l.size + "KB",
                        r.value = "",
                        F = t
                    }
                }), F) return o.msg("文件不能超过" + F)
            }
            y()
        }
    },
    p.prototype.events = function() {
        var e = this,
        t = e.config,
        o = function(i) {
            e.chooseFiles = {},
            layui.each(i,
            function(i, t) {
                var n = (new Date).getTime();
                e.chooseFiles[n + "-" + i] = t
            })
        },
        l = function(i, n) {
            var a = e.elemFile,
            o = i.length > 1 ? i.length + "个文件": (i[0] || {}).name || a[0].value.match(/[^\/\\]+\..+/g) || [] || "";
            a.next().hasClass(s) && a.next().remove(),
            e.upload(null, "choose"),
            e.isFile() || t.choose || a.after('<span class="layui-inline ' + s + '">' + o + "</span>")
        };
        t.elem.off("upload.start").on("upload.start",
        function() {
            var a = i(this),
            o = a.attr("lay-data");
            if (o) try {
                o = new Function("return " + o)(),
                e.config = i.extend({},
                t, o)
            } catch(l) {
                n.error("Upload element property lay-data configuration item has a syntax error: " + o)
            }
            e.config.item = a,
            e.elemFile[0].click()
        }),
        a.ie && a.ie < 10 || t.elem.off("upload.over").on("upload.over",
        function() {
            var e = i(this);
            e.attr("lay-over", "")
        }).off("upload.leave").on("upload.leave",
        function() {
            var e = i(this);
            e.removeAttr("lay-over")
        }).off("upload.drop").on("upload.drop",
        function(n, a) {
            var r = i(this),
            u = a.originalEvent.dataTransfer.files || [];
            r.removeAttr("lay-over"),
            o(u),
            t.auto ? e.upload(u) : l(u)
        }),
        e.elemFile.off("upload.change").on("upload.change",
        function() {
            var i = this.files || [];
            o(i),
            t.auto ? e.upload() : l(i)
        }),
        t.bindAction.off("upload.action").on("upload.action",
        function() {
            e.upload()
        }),
        t.elem.data("haveEvents") || (e.elemFile.on("change",
        function() {
            i(this).trigger("upload.change")
        }), t.elem.on("click",
        function() {
            e.isFile() || i(this).trigger("upload.start")
        }), t.drag && t.elem.on("dragover",
        function(e) {
            e.preventDefault(),
            i(this).trigger("upload.over")
        }).on("dragleave",
        function(e) {
            i(this).trigger("upload.leave")
        }).on("drop",
        function(e) {
            e.preventDefault(),
            i(this).trigger("upload.drop", e)
        }), t.bindAction.on("click",
        function() {
            i(this).trigger("upload.action")
        }), t.elem.data("haveEvents", !0))
    },
    o.render = function(e) {
        var i = new p(e);
        return l.call(i)
    },
    e(r, o)
});