/* 文件上传插件 Uploader options参数: fileType:文件类型(0所有,1图片,2音频,3文档,4其他,5视频) */ (function(){ var main = function(Passport){ Passport.require('/Scripts/Plugins/Uploader/uploader.css'); if(window.webkitURL){ window.URL = window.webkitURL; } var isWin8 = ((navigator.platform === "Win32") || (navigator.platform === "Windows")) && (navigator.userAgent.indexOf("Windows NT 6.2") > -1 || navigator.userAgent.indexOf("Windows 8") > -1); var supportHtml5 = window.FileReader && window.Blob && window.Worker && window.URL; var getFileType = function(type){ var result = {}; switch(type){ case 1: result.types = "*.png;*.gif;*.bmp;*.jpg;*.jpeg;"; result.desc = "图片文件"; result.accept = "image/png,image/gif,image/bmp,image/jpg,image/jpeg"; break; case 2: result.types = "*.amr;*.mp3;*.wav;*.wma;*.mid"; result.desc = "音频文件"; result.accept = "audio/wav,audio/mpeg,audio/wav,audio/x-ms-wma,audio/mid"; break; case 3: result.types = "*.txt;*.rtf;*.doc;*.docx;*.ppt;*.pptx;*.xls;*.xlsx;*.pdf;"; result.desc = "文档文件"; result.accept = "text/plain,application/rtf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/x-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.presentationml.presentation,application/pdf" break; case 5: result.types = "*.mpg;*.mpeg;*.3gp;*.mp4;*.avi;*.wmv;*.mov;*.flv;*.rmvb;*.rm;*.ogg;*.asf;"; result.desc = "视频文件"; result.accept = "audio/mpeg,video/3gpp,video/mp4,video/x-msvideo,video/x-ms-wmv,video/quicktime,video/x-flv,application/vnd.rn-realmedia,video/x-ms-asf"; break; default: result.types = "*.*"; result.desc = "所有文件"; break; } return result; } var formatTime = function(t){ var time = ''; if (t >= 24 * 3600) { time += parseInt(t / (24 * 3600)) + '天 '; t %= 24 * 3600; } if (t >= 3600) { time += (t / 3600 >= 10 ? "" : "0")+ parseInt(t / 3600) + ':'; t %= 3600; }else{ time += "00:" } if (t >= 60) { time += (t / 60 >= 10 ? "" : "0")+ parseInt(t / 60) + ':'; t %= 60; }else{ time += "00:" } time += t>=10 ? t : ("0"+t); return time; } var getFileSize = function(size){ if(size<1024){ return size.toFixed(2) + " B"; }else if(size<1024*1024){ return (size/1024).toFixed(2) + " KB"; }else if(size<1024*1024*1024){ return (size/1024/1024).toFixed(2) + " MB"; }else if(size<1024*1024*1024*1024){ return (size/1024/1024/1024).toFixed(2) + " GB"; }else{ return (size/1024/1024/1024/1024).toFixed(2) + " TB"; } } /*Html5 Uploader*/ var html5Uploader = supportHtml5 && function(options){ var localMd5Url, vertifyWorker, curWorker, curFileId; if(supportHtml5){ window._pt_uploader_jsonp_cb = function(d){ localMd5Url = window.URL.createObjectURL(new Blob([d])); } Passport.require("/Scripts/Plugins/Uploader/md5.js?r="+ Math.random(), function(){ delete window._pt_uploader_jsonp_cb; }); } options = $.extend({ cutVertifyLength: 0, maxVertifyLength: 0, params: {}, fileType: 0 }, options); return { addFileParam: function(file, name, value){ var fileId = typeof(file) == "object" ? file.id : file; if(!options.params.files){ options.params.files = {}; } if(!options.params.files[fileId]){ options.params.files[fileId] = {}; } options.params.files[fileId][name] = value; }, getFile: options.getFile, startVertify: function(fileId){ var file = options.getFile ? options.getFile(fileId) : fileId; var uploader = this; curFileId = file.id; if(file.size==0){ options.fileQueueError && options.fileQueueError(file, -120/*ZERO_BYTE_FILE*/); options.continueUpload && options.continueUpload(); return; } var fileType = getFileType(options.fileType); if(fileType.types!="*.*" && (!file.name || fileType.types.indexOf(file.name.substr(file.name.lastIndexOf('.'))+";")<0)){ options.fileQueueError && options.fileQueueError(file, -130/*INVALID_FILETYPE*/); options.continueUpload && options.continueUpload(); return; } var total = file.size; var loaded = 0; var readTimes = 0; var reader = new FileReader(); var buffer = []; var readFile = function(start){ var size = file.size; if(options.maxVertifyLength && file.size>options.maxVertifyLength){ size = options.cutVertifyLength && options.maxVertifyLength>2*options.cutVertifyLength ? options.cutVertifyLength : options.maxVertifyLength/2; total = size * 2; } var blob; if (file.webkitSlice) { blob = file.webkitSlice(start, start+size); } else{ blob = file.slice(start, start+size); } reader.readAsBinaryString(blob); } reader.onprogress = function(e){ options.vertifyProgress && options.vertifyProgress(file, loaded + e.loaded, total); } reader.onload = function(e){ loaded += e.loaded; } reader.onloadend = function(e) { if(this.readyState == 2) { if(total>loaded){ if(reader.result){ buffer.push(reader.result); readFile(file.size - options.cutVertifyLength); }else{ if(readTimes>1){ options.fileQueueError && options.fileQueueError(file, -120/*ZERO_BYTE_FILE*/); curWorker = null; options.continueUpload && options.continueUpload(); return; }else{ readFile(0); readTimes++; } } }else{ var exec = function(){ if(localMd5Url){ if(!vertifyWorker){ vertifyWorker = new Worker(localMd5Url); } vertifyWorker.onmessage = function(evt){ file.md5 = evt.data; options.vertifyComplete && options.vertifyComplete(file); } vertifyWorker.onerror = function (evt) { options.uploadError && options.uploadError(file, -810/*VERTIFY_FAILED*/); curFileId = null; options.continueUpload && options.continueUpload(); }; var binary = reader.result if(buffer.length>0){ buffer.push(reader.result); binary = buffer.join(''); } vertifyWorker.postMessage(binary); }else{ setTimeout(exec,200); } } exec(); } } } curWorker = reader; readFile(0); }, startUpload: function(fileId){ file = options.getFile ? options.getFile(fileId) : fileId; var uploader = this; var xhr = new XMLHttpRequest(); var lastProgressTicks,lastProgressBytes; xhr.upload.addEventListener("progress", function (e) { if (e.lengthComputable) { var ticks = (new Date()).getTime(); var interval,speed; if(lastProgressTicks){ interval = (ticks-lastProgressTicks)/1000; speed = (e.loaded-lastProgressBytes)/interval; } lastProgressTicks = ticks; lastProgressBytes = e.loaded+0; var leaveseconds = speed>0 ? Math.ceil((e.total - e.loaded) / speed) : -1; options.uploadProgress && options.uploadProgress(file, e.loaded+0, e.total+0, speed, leaveseconds); } }, false); // File uploaded xhr.addEventListener("load", function (e) { if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) { options.uploadSuccess && options.uploadSuccess(file, xhr.responseText, xhr); file.filestatus = -4/*COMPLETE*/; }else if(xhr.responseText){ var data = $.parseJSON(xhr.responseText); options.uploadError && options.uploadError(file, -820/*UNKNOWN_ERROR*/, data.Msg); file.filestatus = -1/*Error*/; }else{ options.uploadError && options.uploadError(file, -820/*UNKNOWN_ERROR*/); file.filestatus = -1/*Error*/; } curFileId = null; options.uploadComplete && options.uploadComplete(file); }, false); xhr.addEventListener("abort", function (e) { options.uploadError && options.uploadError(file, -280/*FILE_CANCELLED*/); curFileId = null; file.filestatus = -5/*CANCELLED*/; options.uploadComplete && options.uploadComplete(file); }, false); xhr.addEventListener("error", function (e) { options.uploadError && options.uploadError(file, -200/*HTTP_ERROR*/); curFileId = null; options.continueUpload && options.continueUpload(); }, false); var formData = new FormData(); var data = {}; for(var key in options.params){ if(key == "files"){ for(var name in options.params.files[file.id]){ formData.append(name, options.params.files[file.id][name]); data[name] = options.params.files[file.id][name]; } delete options.params.files[file.id]; }else{ formData.append(key, options.params[key]); data[key] = options.params[key]; } } formData.append("Filedata", file); curWorker = xhr; xhr.open("post", options.uploadUrl, true); xhr.send(formData); }, cancelUpload: function(file){ var fileId = typeof(file) == "object" ? file.id : file; if(!fileId || fileId == curFileId){ if(curWorker && curWorker.abort){ curWorker.abort(); curWorker = null; } if(fileId){ options.continueUpload && options.continueUpload(); }else{ if(localMd5Url && window.URL){ window.URL.revokeObjectURL(localMd5Url); localMd5Url = null; } if(vertifyWorker && vertifyWorker.terminate){ vertifyWorker.terminate(); vertifyWorker = null; } } } } }; } var createFileId = function(){ var rnd = Math.random(); return new Date().getTime() + Math.floor(9999-rnd*1000); }; Passport(['/Plugins/Dialog', '/Scripts/Plugins/Uploader/swfupload.js'], function(){ var Uploader = Passport.Uploader = { baseDir: Passport.baseUrl + "/Scripts/Plugins/Uploader/", softId: "1005", apiUrl: Passport.baseUrl + "/api/upload", uploadUrl: "http://cloudstorage.im2x.com/uploader/upload2", //limitSize: 1024, btnWidth: 82, btnHeight: 30, codeLevelLength: 4, maxVertifyLength: 10*1024 *1024, cutVertifyLength: 1024 *1024, rootFolderCode: '0001', isSecret: true, useHtml5Feature: !isWin8 && supportHtml5, formatTime: formatTime, formatFileSize: getFileSize, cancel: function(file){ this.processor && this.processor.cancelUpload(file && file.id ? file.id : file); }, upload: function(files, options){ var self = this; options = options || {} if(files && files.length>0 && html5Uploader){ var file_index = 0; var upload = function(index, filestatus){ if(files.length>index){ var file = files[index]; file.id = createFileId(); self.processor.startVertify(file); }else{ options.complete && options.complete(filestatus); } } self.processor = new html5Uploader({ maxVertifyLength : self.maxVertifyLength, cutVertifyLength: self.cutVertifyLength, uploadUrl: self.uploadUrl, params: { "softId": self.softId, "width": self._iconWidth, "height": self._iconHeight, "isSecret": self.isSecret }, fileQueueError: function(file, code, msg){ options.error && options.error(file, code); }, uploadError: function(file, code, msg){ options.error && options.error(file, code); }, vertifyProgress: function(file, loaded, total){ options.progress && options.progress("vertify", file, { loaded: loaded, total: total }); }, vertifyComplete: function(file){ var uploader = this; options.success && options.success("vertify", file); self._vertifyComplete(file, function(obj){ $.extend(file, { sign: obj.Sign }); if(obj.FileModel && obj.FileModel.FileKey){ self.processor.cancelUpload(file.id, false); var result = $.extend({}, file, { key: obj.FileModel.FileKey, size: obj.FileModel.Size, url: obj.FileModel.FileUrl, typeId: obj.FileModel.Type, thumbImage: obj.FileModel.ThumbImgUrl, extension: obj.FileModel.FileExInfo, filestatus: -4/*COMPLETE*/ }); options.success && options.success("upload", result); uploader.continueUpload(); }else{ self.processor.addFileParam(file.id, "fileName", file.name); self.processor.addFileParam(file.id, "fileLength", file.size); self.processor.addFileParam(file.id, "fileMd5", file.md5+"_"+file.size); self.processor.addFileParam(file.id, "sign", obj.Sign); self.processor.startUpload(file); } }); }, uploadProgress: function(file, loaded, total, speed, leaveseconds){ options.progress && options.progress("upload", file, { loaded: loaded, total: total, speed: speed, leaveseconds: leaveseconds }); }, uploadSuccess: function(file, data){ var d = $.parseJSON(data); if(d){ var result = $.extend({}, file, { key: d.FileKey, url: d.FileUrl, size: d.Size, typeId: d.Type, thumbImage: d.ThumbImgUrl, extension: d.FileExInfo }); } options.success && options.success("upload", result); }, uploadComplete: function(file){ this.continueUpload(file && file.filestatus); }, continueUpload: function(filestatus){ file_index++; upload(file_index, filestatus); } }); upload(file_index); } }, showDialog: function(callback, options){ var self = this; options = $.extend({ fileType: 0, simpleMode: false, beforeHide: function(){ self.processor && self.processor.cancelUpload(); } },options); var blankImage = self.baseDir +'images/blank.gif'; var folders = [ ]; var fileState = { Error:-1, Normal: 0, Vertify:1, Upload:2, Complete:3, Cancel:4 } var getFolderPath = function(code){ var arr = []; for(var i in folders){ if(folders[i].code.length <= code.length && code.indexOf(folders[i].code)==0){ arr.push(folders[i].name +'\\'); if(folders[i].code.length == code.length){ break; } } } return arr.join(''); } var refreshFolders = function(mode, code){ var arr = []; var path = ""; var curCode = code; if(folders.length>0){ if(code){ path = getFolderPath(code); }else{ path = folders[0].name+"\\"; curCode = folders[0].code; } } code = code || self.rootFolderCode; for(var i in folders){ if(folders[i].code.length>code.length + self.codeLevelLength){ break; } if(folders[i].code.length == code.length + self.codeLevelLength){ arr.push('
  • '+ folders[i].name +'
  • '); } } var html = arr.join(''); var bindEvent = function(dropdown){ dropdown.find("li i").mousedown(function(){ if($(this).hasClass("pt-expand")){ $(this).removeClass("pt-expand").addClass("pt-collapse"); }else if($(this).hasClass("pt-collapse")){ $(this).removeClass("pt-collapse").addClass("pt-expand"); } return false; }) dropdown.find("a").mousedown(function(e){ var code = $(this).attr("data-code"); var exp = $(this).parents(".pt-folders").prev(".pt-explorer"); if(code == exp.attr("data-code")) return; exp.attr("data-code", code).find("b").text(getFolderPath(code)); if(exp.parents(".pt-select").length>0){ refreshFiles(code); } e.preventDefault(); }).click(function(){ return false; }); } if(mode!="upload"){ var explorer = container.find(".pt-upload .pt-explorer").attr("data-code", curCode); if(curCode){ var f = explorer.find("b").text(path).end() .next(".pt-folders").children("ul").append(html).end(); bindEvent(f); } } if(mode!="select"){ var explorer = container.find(".pt-select .pt-explorer").attr("data-code", curCode); if(curCode){ var f = explorer.find("b").text(path).end() .next(".pt-folders").children("ul").append(html).end(); bindEvent(f); if(curCode.length>2*self.codeLevelLength){ explorer.find("span").removeClass("pt-disabled"); }else{ explorer.find("span").addClass("pt-disabled"); } } } } var refreshFiles = function(code, sort){ if(!code){ code = container.find(".pt-select .pt-explorer").attr("data-code"); } var files = container.find(".pt-select .pt-files>ul").empty(); if(code){ var size = {width:self._iconWidth, height:self._iconHeight}; if(container.find(".pt-select .pt-files").hasClass("pt-iconmode")){ size.width = 82; size.height = 73; } Passport.postBack({ url: self.apiUrl, type: "GET", dataType: "jsonp", data: $.param({ "pcode": code, "fileType": options.fileType, "imgW": size.width, "imgH": size.height, "orderType": sort || 2 }), success: function(data){ if(data && data.length>0){ var arr = []; for(var i in data){ var ext = ""; if(data[i].FileKey.indexOf(".")>0){ ext = data[i].FileKey.substring(data[i].FileKey.lastIndexOf(".")+1).toLowerCase(); } var imgUrl = blankImage; if(data[i].Type == 1){ imgUrl = data[i].ThumbImgUrl; } arr.push($('\
  • \ '+ data[i].CreatedTime +'\ '+ getFileSize(data[i].Size) +'\
    \ \ \

    '+ data[i].Name +'

    \
    \
  • ').click(function(e){ if(e.target.tagName == 'A' || e.target.tagName == 'INPUT') return; if(!$(this).find("input").attr("checked")){ $(this).find("input").attr("checked", true); } }).data("data-file", { key: data[i].FileKey, name: data[i].Name, size: data[i].Size, url: data[i].FileUrl, type: data[i].Name && data[i].Name.substr(data[i].Name.lastIndexOf('.')), typeId: data[i].Type, thumbImage: data[i].ThumbImgUrl, extension: data[i].FileExInfo })); } $.each(arr, function(){ files.append(this); }); } } }); } } var getFileInfo = function(file){ var fileId = typeof(file) == "object" ? file.id : file; var fileItem = container.find(".pt-upload .pt-files li[data-id='"+ fileId +"']"); if(fileItem.length>0){ return fileItem.data("data-file"); } return null; } var setFileInfo = function(file, name, value){ var fileItem = container.find(".pt-upload .pt-files li[data-id='"+ file.id +"']"); if(fileItem.length>0){ var datafile = fileItem.data("data-file"); if(name){ var obj = {}; if(typeof name == "string"){ obj[name] = value; }else{ obj = name; } if(datafile){ $.extend(datafile, file, obj); }else{ fileItem.data("data-file", $.extend(file, obj)); } }else{ fileItem.data("data-file", file); } } } var updateFileItem = function(state, file, tag){ var files = container.find(".pt-upload .pt-files"); var fileItem = files.find("li[data-id='"+ file.id +"']"); if(fileItem.length==0){ if(files.children("ul").length==0){ files.children(".pt-desc").hide(); files.append('