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

/*
UploadiFive 1.1.2
Copyright (c) 2012 Reactive Apps, Ronnie Garcia
Released 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">
		<%
		randomize
		ranNum=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>

仅供参考
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值