uploadifive 改进版 用于HTML5手机网站上传图片

来源:互联网 发布:成都网络推广公司 编辑:程序博客网 时间:2024/05/20 06:24
/*UploadiFive 1.1.2Copyright (c) 2012 Reactive Apps, Ronnie GarciaReleased under the UploadiFive Standard License <http://www.uploadify.com/uploadifive-standard-license>*/(function(b) {    var a = {        init: function(c) {            return this.each(function() {                var g = b(this);                g.data("uploadifive", {                    inputs: {},                    inputCount: 0,                    fileID: 0,                    queue: {                        count: 0,                        selected: 0,                        replaced: 0,                        errors: 0,                        queued: 0,                        cancelled: 0                    },                    uploads: {                        current: 0,                        attempts: 0,                        successful: 0,                        errors: 0,                        count: 0                    }                });                var d = g.data("uploadifive");                var f = d.settings = b.extend({                    auto: true,                    buttonClass: false,                    buttonText: "Select Files",                    checkScript: false,                    dnd: true,                    dropTarget: false,                    fileObjName: "Filedata",                    fileSizeLimit: 0,                    fileType: false,                    formData: {},                    height: 30,                    itemTemplate: false,                    method: "post",                    multi: true,                    overrideEvents: [],                    queueID: false,                    queueSizeLimit: 0,                    removeCompleted: false,                    simUploadLimit: 0,                    truncateLength: 0,                    uploadLimit: 0,                    uploadScript: "uploadifive.php",                    width: 100                },                c);                if (isNaN(f.fileSizeLimit)) {                    var e = parseInt(f.fileSizeLimit) * 1.024;                    if (f.fileSizeLimit.indexOf("KB") > -1) {                        f.fileSizeLimit = e * 1000;                    } else {                        if (f.fileSizeLimit.indexOf("MB") > -1) {                            f.fileSizeLimit = e * 1000000;                        } else {                            if (f.fileSizeLimit.indexOf("GB") > -1) {                                f.fileSizeLimit = e * 1000000000;                            }                        }                    }                } else {                    f.fileSizeLimit = f.fileSizeLimit * 1024;                }                d.inputTemplate = b('<input type="file">').css({                    "font-size": f.height + "px",                    opacity: 0,                    position: "absolute",                    right: "-3px",                    top: "-3px",                    "z-index": 999                });                d.createInput = function() {                    var j = d.inputTemplate.clone();                    var k = j.name = "input" + d.inputCount++;                    if (f.multi) {                        j.attr("multiple", true);                    }                    j.bind("change",                    function() {                        d.queue.selected = 0;                        d.queue.replaced = 0;                        d.queue.errors = 0;                        d.queue.queued = 0;                        var l = this.files.length;                        d.queue.selected = l;                        if ((d.queue.count + l) > f.queueSizeLimit && f.queueSizeLimit !== 0) {                            if (b.inArray("onError", f.overrideEvents) < 0) {                                alert("The maximum number of queue items has been reached (" + f.queueSizeLimit + ").  Please select fewer files.");                            }                            if (typeof f.onError === "function") {                                f.onError.call(g, "QUEUE_LIMIT_EXCEEDED");                            }                        } else {                            for (var m = 0; m < l; m++) {                                file = this.files[m];                                d.addQueueItem(file);                            }                            d.inputs[k] = this;                            d.createInput();                        }                        if (f.auto) {                            a.upload.call(g);                        }                        if (typeof f.onSelect === "function") {                            f.onSelect.call(g, d.queue);                        }                    });                    if (d.currentInput) {                        d.currentInput.hide();                    }                    d.button.append(j);                    d.currentInput = j;                };                d.destroyInput = function(j) {                    b(d.inputs[j]).remove();                    delete d.inputs[j];                    d.inputCount--;                };                d.drop = function(m) {                    d.queue.selected = 0;                    d.queue.replaced = 0;                    d.queue.errors = 0;                    d.queue.queued = 0;                    var l = m.dataTransfer;                    var k = l.name = "input" + d.inputCount++;                    var j = l.files.length;                    d.queue.selected = j;                    if ((d.queue.count + j) > f.queueSizeLimit && f.queueSizeLimit !== 0) {                        if (b.inArray("onError", f.overrideEvents) < 0) {                            alert("The maximum number of queue items has been reached (" + f.queueSizeLimit + ").  Please select fewer files.");                        }                        if (typeof f.onError === "function") {                            f.onError.call(g, "QUEUE_LIMIT_EXCEEDED");                        }                    } else {                        for (var o = 0; o < j; o++) {                            file = l.files[o];                            d.addQueueItem(file);                        }                        d.inputs[k] = l;                    }                    if (f.auto) {                        a.upload.call(g);                    }                    if (typeof f.onDrop === "function") {                        f.onDrop.call(g, l.files, l.files.length);                    }                    m.preventDefault();                    m.stopPropagation();                };                d.fileExistsInQueue = function(k) {                    for (var j in d.inputs) {                        input = d.inputs[j];                        limit = input.files.length;                        for (var l = 0; l < limit; l++) {                            existingFile = input.files[l];                            if (existingFile.name == k.name && !existingFile.complete) {                                return true;                            }                        }                    }                    return false;                };                d.removeExistingFile = function(k) {                    for (var j in d.inputs) {                        input = d.inputs[j];                        limit = input.files.length;                        for (var l = 0; l < limit; l++) {                            existingFile = input.files[l];                            if (existingFile.name == k.name && !existingFile.complete) {                                d.queue.replaced++;                                a.cancel.call(g, existingFile, true);                            }                        }                    }                };                if (f.itemTemplate == false) {                    d.queueItem = b('<div class="uploadifive-queue-item">                        <a class="close" href="#">X</a>                        <div><span class="filename"></span><span class="filesize"></span><span class="fileinfo"></span></div>                        <div class="progress">                            <div class="progress-bar"></div>                        </div>                    </div>');                } else {                    d.queueItem = b(f.itemTemplate);                }                d.addQueueItem = function(k) {                    if (b.inArray("onAddQueueItem", f.overrideEvents) < 0) {                        d.removeExistingFile(k);                        k.queueItem = d.queueItem.clone();                        k.queueItem.attr("id", f.id + "-file-" + d.fileID++);                        k.queueItem.find(".close").bind("click",                        function() {                            a.cancel.call(g, k);                            return false;                        });                        var m = k.name;                        if (m.length > f.truncateLength && f.truncateLength != 0) {                            m = m.substring(0, f.truncateLength) + "...";                        }                        k.queueItem.find(".filename").html(m);var fileSize = Math.round(file.size / 1024);var suffix = 'KB';if (fileSize > 1000) {fileSize = Math.round(fileSize / 1000);suffix = 'MB';}var fileSizeParts = fileSize.toString().split('.');fileSize = fileSizeParts[0];if (fileSizeParts.length > 1) {fileSize += '.' + fileSizeParts[1].substr(0, 2);}fileSize += suffix;file.queueItem.find('.filesize').html('('+fileSize+')');                        k.queueItem.data("file", k);                        d.queueEl.append(k.queueItem);                    }                    if (typeof f.onAddQueueItem === "function") {                        f.onAddQueueItem.call(g, k);                    }                    if (f.fileType) {                        if (b.isArray(f.fileType)) {                            var j = false;                            for (var l = 0; l < f.fileType.length; l++) {                                if (k.type.indexOf(f.fileType[l]) > -1) {                                    j = true;                                }                            }                            if (!j) {                                d.error("FORBIDDEN_FILE_TYPE", k);                            }                        } else {                            if (k.type.indexOf(f.fileType) < 0) {                                d.error("FORBIDDEN_FILE_TYPE", k);                            }                        }                    }                    if (k.size > f.fileSizeLimit && f.fileSizeLimit != 0) {                        d.error("FILE_SIZE_LIMIT_EXCEEDED", k);                    } else {                        d.queue.queued++;                        d.queue.count++;                    }                };                d.removeQueueItem = function(m, l, k) {                    if (!k) {                        k = 0;                    }                    var j = l ? 0 : 500;                    if (m.queueItem) {                        if (m.queueItem.find(".fileinfo").html() != " - 上传成功") {                            m.queueItem.find(".fileinfo").html(" - Cancelled");                        }                        m.queueItem.find(".progress-bar").width(0);                        m.queueItem.delay(k).fadeOut(j,                        function() {                            b(this).remove();                        });                        delete m.queueItem;                        d.queue.count--;                    }                };                d.filesToUpload = function() {                    var k = 0;                    for (var j in d.inputs) {                        input = d.inputs[j];                        limit = input.files.length;                        for (var l = 0; l < limit; l++) {                            file = input.files[l];                            if (!file.skip && !file.complete) {                                k++;                            }                        }                    }                    return k;                };                d.checkExists = function(k) {                    if (b.inArray("onCheck", f.overrideEvents) < 0) {                        b.ajaxSetup({                            async: false                        });                        var j = b.extend(f.formData, {                            filename: k.name                        });                        b.post(f.checkScript, j,                        function(l) {                            k.exists = parseInt(l);                        });                        if (k.exists) {                            if (!confirm("A file named " + k.name + " already exists in the upload folder.\nWould you like to replace it?")) {                                a.cancel.call(g, k);                                return true;                            }                        }                    }                    if (typeof f.onCheck === "function") {                        f.onCheck.call(g, k, k.exists);                    }                    return false;                };                d.uploadFile = function(k, l) {                    if (!k.skip && !k.complete && !k.uploading) {                        k.uploading = true;                        d.uploads.current++;                        d.uploads.attempted++;                        xhr = k.xhr = new XMLHttpRequest();                        if (typeof FormData === "function" || typeof FormData === "object") {                            var m = new FormData();                            m.append(f.fileObjName, k);                            for (i in f.formData) {                                m.append(i, f.formData[i]);                            }                            xhr.open(f.method, f.uploadScript, true);                            xhr.upload.addEventListener("progress",                            function(n) {                                if (n.lengthComputable) {                                    d.progress(n, k);                                }                            },                            false);                            xhr.addEventListener("load",                            function(n) {                                if (this.readyState == 4) {                                    k.uploading = false;                                    if (this.status == 200) {                                        if (k.xhr.responseText !== "Invalid file type.") {                                            d.uploadComplete(n, k, l);                                        } else {                                            d.error(k.xhr.responseText, k, l);                                        }                                    } else {                                        if (this.status == 404) {                                            d.error("404_FILE_NOT_FOUND", k, l);                                        } else {                                            if (this.status == 403) {                                                d.error("403_FORBIDDEN", k, l);                                            } else {                                                d.error("Unknown Error", k, l);                                            }                                        }                                    }                                }                            });                            xhr.send(m);                        } else {                            var j = new FileReader();                            j.onload = function(q) {                                var t = "-------------------------" + (new Date).getTime(),                                p = "--",                                o = "\r\n",                                s = "";                                s += p + t + o;                                s += 'Content-Disposition: form-data; name="' + f.fileObjName + '"';                                if (k.name) {                                    s += '; filename="' + k.name + '"';                                }                                s += o;                                s += "Content-Type: application/octet-stream" + o + o;                                s += q.target.result + o;                                for (key in f.formData) {                                    s += p + t + o;                                    s += 'Content-Disposition: form-data; name="' + key + '"' + o + o;                                    s += f.formData[key] + o;                                }                                s += p + t + p + o;                                xhr.upload.addEventListener("progress",                                function(u) {                                    d.progress(u, k);                                },                                false);                                xhr.addEventListener("load",                                function(v) {                                    k.uploading = false;                                    var u = this.status;                                    if (u == 404) {                                        d.error("404_FILE_NOT_FOUND", k, l);                                    } else {                                        if (k.xhr.responseText != "Invalid file type.") {                                            d.uploadComplete(v, k, l);                                        } else {                                            d.error(k.xhr.responseText, k, l);                                        }                                    }                                },                                false);                                var n = f.uploadScript;                                if (f.method == "get") {                                    var r = b(f.formData).param();                                    n += r;                                }                                xhr.open(f.method, f.uploadScript, true);                                xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + t);                                if (typeof f.onUploadFile === "function") {                                    f.onUploadFile.call(g, k);                                }                                xhr.sendAsBinary(s);                            };                            j.readAsBinaryString(k);                        }                    }                };                d.progress = function(l, j) {                    if (b.inArray("onProgress", f.overrideEvents) < 0) {                        if (l.lengthComputable) {                            var k = Math.round((l.loaded / l.total) * 100);                        }                        j.queueItem.find(".fileinfo").html(" - " + k + "%");                        j.queueItem.find(".progress-bar").css("width", k + "%");                    }                    if (typeof f.onProgress === "function") {                        f.onProgress.call(g, j, l);                    }                };                d.error = function(l, j, k) {                    if (b.inArray("onError", f.overrideEvents) < 0) {                        switch (l) {                        case "404_FILE_NOT_FOUND":                            errorMsg = "404 Error";                            break;                        case "403_FORBIDDEN":                            errorMsg = "403 Forbidden";                            break;                        case "FORBIDDEN_FILE_TYPE":                            errorMsg = "Forbidden File Type";                            break;                        case "FILE_SIZE_LIMIT_EXCEEDED":                            errorMsg = "图片已超出200K,请重新上传!";                            break;                        default:                            errorMsg = "Unknown Error";                            break;                        }                        j.queueItem.addClass("error").find(".fileinfo").html(" - " + errorMsg);                        j.queueItem.find(".progress").remove();                    }                    if (typeof f.onError === "function") {                        f.onError.call(g, l, j);                    }                    j.skip = true;                    if (l == "404_FILE_NOT_FOUND") {                        d.uploads.errors++;                    } else {                        d.queue.errors++;                    }                    if (k) {                        a.upload.call(g, null, true);                    }                };                d.uploadComplete = function(l, j, k) {                    if (b.inArray("onUploadComplete", f.overrideEvents) < 0) {                        j.queueItem.find(".progress-bar").css("width", "100%");                        j.queueItem.find(".fileinfo").html(" - 上传成功");                        j.queueItem.find(".progress").slideUp(250);                        j.queueItem.addClass("complete");                    }                    if (typeof f.onUploadComplete === "function") {                        f.onUploadComplete.call(g, j, j.xhr.responseText);                    }                    if (f.removeCompleted) {                        setTimeout(function() {                            a.cancel.call(g, j);                        },                        3000);                    }                    j.complete = true;                    d.uploads.successful++;                    d.uploads.count++;                    d.uploads.current--;                    delete j.xhr;                    if (k) {                        a.upload.call(g, null, true);                    }                };                d.queueComplete = function() {                    if (typeof f.onQueueComplete === "function") {                        f.onQueueComplete.call(g, d.uploads);                    }                };                if (window.File && window.FileList && window.Blob && (window.FileReader || window.FormData)) {                    f.id = "uploadifive-" + g.attr("id");                    d.button = b('<div id="' + f.id + '" class="uploadifive-button">' + f.buttonText + "</div>");                    if (f.buttonClass) {                        d.button.addClass(f.buttonClass);                    }                    d.button.css({                        height: f.height,                        "line-height": f.height + "px",                        overflow: "hidden",                        position: "relative",                        "text-align": "center",                        width: f.width                    });                    g.before(d.button).appendTo(d.button).hide();                    d.createInput.call(g);                    if (!f.queueID) {                        f.queueID = f.id + "-queue";                        d.queueEl = b('<div id="' + f.queueID + '" class="uploadifive-queue" />');                        d.button.after(d.queueEl);                    } else {                        d.queueEl = b("#" + f.queueID);                    }                    if (f.dnd) {                        var h = f.dropTarget ? b(f.dropTarget) : d.queueEl.get(0);                        h.addEventListener("dragleave",                        function(j) {                            j.preventDefault();                            j.stopPropagation();                        },                        false);                        h.addEventListener("dragenter",                        function(j) {                            j.preventDefault();                            j.stopPropagation();                        },                        false);                        h.addEventListener("dragover",                        function(j) {                            j.preventDefault();                            j.stopPropagation();                        },                        false);                        h.addEventListener("drop", d.drop, false);                    }                    if (!XMLHttpRequest.prototype.sendAsBinary) {                        XMLHttpRequest.prototype.sendAsBinary = function(k) {                            function l(n) {                                return n.charCodeAt(0) & 255;                            }                            var m = Array.prototype.map.call(k, l);                            var j = new Uint8Array(m);                            this.send(j.buffer);                        };                    }                    if (typeof f.onInit === "function") {                        f.onInit.call(g);                    }                } else {                    if (typeof f.onFallback === "function") {                        f.onFallback.call(g);                    }                    return false;                }            });        },        debug: function() {            return this.each(function() {                console.log(b(this).data("uploadifive"));            });        },        clearQueue: function() {            this.each(function() {                var f = b(this),                c = f.data("uploadifive"),                e = c.settings;                for (var d in c.inputs) {                    input = c.inputs[d];                    limit = input.files.length;                    for (i = 0; i < limit; i++) {                        file = input.files[i];                        a.cancel.call(f, file);                    }                }                if (typeof e.onClearQueue === "function") {                    e.onClearQueue.call(f, b("#" + c.settings.queueID));                }            });        },        cancel: function(d, c) {            this.each(function() {                var g = b(this),                e = g.data("uploadifive"),                f = e.settings;                if (typeof d === "string") {                    if (!isNaN(d)) {                        fileID = "uploadifive-" + b(this).attr("id") + "-file-" + d;                    }                    d = b("#" + fileID).data("file");                }                d.skip = true;                e.filesCancelled++;                if (d.uploading) {                    e.uploads.current--;                    d.uploading = false;                    d.xhr.abort();                    delete d.xhr;                    a.upload.call(g);                }                if (b.inArray("onCancel", f.overrideEvents) < 0) {                    e.removeQueueItem(d, c);                }                if (typeof f.onCancel === "function") {                    f.onCancel.call(g, d);                }            });        },        upload: function(c, d) {            this.each(function() {                var h = b(this),                e = h.data("uploadifive"),                f = e.settings;                if (c) {                    e.uploadFile.call(h, c);                } else {                    if ((e.uploads.count + e.uploads.current) < f.uploadLimit || f.uploadLimit == 0) {                        if (!d) {                            e.uploads.attempted = 0;                            e.uploads.successsful = 0;                            e.uploads.errors = 0;                            var g = e.filesToUpload();                            if (typeof f.onUpload === "function") {                                f.onUpload.call(h, g);                            }                        }                        b("#" + f.queueID).find(".uploadifive-queue-item").not(".error, .complete").each(function() {                            _file = b(this).data("file");                            if ((e.uploads.current >= f.simUploadLimit && f.simUploadLimit !== 0) || (e.uploads.current >= f.uploadLimit && f.uploadLimit !== 0) || (e.uploads.count >= f.uploadLimit && f.uploadLimit !== 0)) {                                return false;                            }                            if (f.checkScript) {                                _file.checking = true;                                skipFile = e.checkExists(_file);                                _file.checking = false;                                if (!skipFile) {                                    e.uploadFile(_file, true);                                }                            } else {                                e.uploadFile(_file, true);                            }                        });                        if (b("#" + f.queueID).find(".uploadifive-queue-item").not(".error, .complete").size() == 0) {                            e.queueComplete();                        }                    } else {                        if (e.uploads.current == 0) {                            if (b.inArray("onError", f.overrideEvents) < 0) {                                if (e.filesToUpload() > 0 && f.uploadLimit != 0) {                                    alert("The maximum upload limit has been reached.");                                }                            }                            if (typeof f.onError === "function") {                                f.onError.call(h, "UPLOAD_LIMIT_EXCEEDED", e.filesToUpload());                            }                        }                    }                }            });        },        destroy: function() {            this.each(function() {                var e = b(this),                c = e.data("uploadifive"),                d = c.settings;                a.clearQueue.call(e);                if (!d.queueID) {                    b("#" + d.queueID).remove();                }                e.siblings("input").remove();                e.show().insertBefore(c.button);                c.button.remove();                if (typeof d.onDestroy === "function") {                    d.onDestroy.call(e);                }            });        }    };    b.fn.uploadifive = function(c) {        if (a[c]) {            return a[c].apply(this, Array.prototype.slice.call(arguments, 1));        } else {            if (typeof c === "object" || !c) {                return a.init.apply(this, arguments);            } else {                b.error("The method " + c + " does not exist in $.uploadify");            }        }    };})(jQuery);
<script type="text/javascript"><%randomizeranNum=int(90000*rnd)+10000%>$(function() {$('#file_upload').uploadifive({'auto'             : true,'multi'            : false,'buttonText'       :'选择图片','removeCompleted'  : true,'fileSizeLimit'    : '200KB','formData'         : {   'timestamp' : '<%= ranNum %>',   'token'     : '<%= md5("unique_salt"&ranNum)%>'                     },'queueID'          : 'queue','uploadScript'     : 'uploadifive.asp','onUploadComplete' : function(file, data) {var obj=JSON.parse(data); $('.filename').val(obj.filename);}});});</script>

仅供参考
0 0
原创粉丝点击