Namespace.register("U.MD.UI"); //Disk上传的命名空间
//#region 上传区域 Html5 Flash html
//整个控件的名字规范函数名字
/**
* 上传带界面的函数
* @param {string} url为服务器地址
* @param {function} 回调函数
* @param {function} 判断hash值回调函数
* 回调函数返回结果:url为服务器地址返回的值。
*/
U.MD.UI.upload = function (url, cb, hashcallback) {
//如果有flash,则走flash。
var _str = U.UF.CI.isSupportFlash(); //得到客户端支持html还是flash的处理
//_str = "Flash";
//html5的处理和html的处理,如果html,不能断点续传,不能解析md5.
if (_str == "HTML5") {
U.MD.UI.upload.html5(url, cb, hashcallback);
}
//flash的处理
else if (_str == "Flash") {
U.MD.UI.upload.flash(url, cb, hashcallback);
}
//只能通过input上传的处理
else {
U.MD.UI.upload.input(url, cb, hashcallback);
}
}
//所有的上传框选择的文件处理
U.MD.UI.upload.uploadFileInfo = [];
/**
* 文件上传函数
*@param
* @param {string} url为服务器地址
* @param {function} 回调函数
* @param {function} 判断hash值回调函数
* 回调函数返回结果:url为服务器地址返回的值。
*/
U.MD.UI.upload.upfiles = function (r,url, cb, hashcallback) {
U.MD.UI.inputSelect({
//错误处理
error: function (r) {
console.log("上传错误:" + r);
},
//获取hash回调
getHashCallBack: function (filehash, fileinfo, callback) {
//判断获取hash
hashcallback(filehash, fileinfo, function (isupload) {
//判断是否上传的处理
if (isupload) { //如果md5匹配后还是要求上传,那么这里就处理上传
//判断数据库是否有该文件hash值 回调参数(文件服务器名,服务器文件大小)
U.UF.UP.html5Upload.select(fileinfo, filehash, function (fileservername, filesize) {
//上传处理
U.UF.UP.html5Upload.loop(fileinfo, filehash, fileservername, filesize, function (value) {
//上传成功的处理
if (value == true) {
callback.getData(filehash, fileservername, fileinfo); //得到返回值处理
var _nextuploadfile = U.MD.UI.delUploadFile(fileinfo.fileel, fileinfo); //删除上传成功后的文件,得到下一个需要上传的文件
// 如果有下一个文件要上传的处理
if (_nextuploadfile) {
U.MD.UI.inputUpload(_nextuploadfile, callback);
}
}
//上传中的处理
else {
callback.progress(value, fileinfo.fileid, "上传中"); //生成进度条
}
});
});
}
else {
var _nextuploadfile = U.MD.UI.delUploadFile(fileinfo.fileel, fileinfo); //删除上传成功后的文件,得到下一个需要上传的文件
// 如果有下一个文件要上传的处理
if (_nextuploadfile) {
U.MD.UI.inputUpload(_nextuploadfile, callback);
}
}
});
},
//获取进度条
progress: U.MD.UI.progress, //上传文件的进度条处理
//得到服务器返回值的处理
getData: function (filehash, fileservername, file) {
var _type = file.name.substring(file.name.lastIndexOf('.') + 1, file.name.length), //获取文件后缀名
_thumbnailname = 'gif|jpg|jpeg|png'.indexOf(_type.toLowerCase()) > -1 ? (Guid.newGuid() + "." + _type) : null; //判断是否为图片
//如果是图片则创建缩略图
if (_thumbnailname) {
U.A.Request(US.DISK, ['CreateThumbnail', fileservername, _thumbnailname], function (r) { });
}
//添加文件到数据库
U.A.Request(US.CD, [US.DB, 'UseStudio_Disk', 'CreateUploadFile', U.UF.C.queryString("UserId", url), file.fileid, U.UF.C.queryString("DirectoryId", url), file.name, fileservername, _thumbnailname, filehash, file.size, 1, file.name, _type, U.UF.C.queryString("Encrypt", url)],
function (request) {
cb({ data: [fileservername, fileservername, file.fileid, file.size, U.UF.C.queryString("Encrypt", url), U.UF.C.queryString("DirectoryId", url)] }, file);
});
}
});
this.value = "";
}
/**
* HTML5上传
* @param {string} url为服务器地址
* @param {function} 回调函数
* @param {function} 判断hash值回调函数
* 回调函数返回结果:url为服务器地址返回的值。
*/
U.MD.UI.upload.html5 = function (url, cb, hashcallback) {
//如果是html5,走html5
U.MD.UI.create(); //创建传出上传框
var _clickuploadel = U.selectEl("#U_MD_UI_UP_DRT")[0]; //获取上传按钮的处理
_clickuploadel.innerText = "";
//创建一个input file
$$("input", { "multiple": "true", "type": "file", "accept": "*/*", "onchange": function (r) {
U.MD.UI.upload.upfiles(r, url, cb, hashcallback);
return false; //防止重复执行
}, "style": { "cssText": "display: block; position: relative; width: 100%; height: 100%; cursor: pointer; border: 0; color: #666; background: #eee; -moz-user-select: -moz-none; -webkit-user-select: none; opacity: 0; filter: alpha(opacity=0); -moz-opacity: 0;" }
}, _clickuploadel);
if ($("#U_MD_UI_UP_C")[0].length != 0) //通过判断页面上是否要待传的文件判断是否为input提交,如果不是则
U.MD.UI.upload.upfiles(event, url, cb, hashcallback);
}
/**
* Flash上传
* @param {string} url为服务器地址
* @param {function} 回调函数
* @param {function} 判断hash值回调函数
* 回调函数返回结果:url为服务器地址返回的值。
*/
U.MD.UI.upload.flash = function (url, cb, hashcallback) {
U.MD.UI.create(); //创建传出上传框
var _url = url,
_cb = cb,
_hashcallback = hashcallback,
_clickuploadel = U.selectEl("#U_MD_UI_UP_DRT")[0]; //获取上传按钮的处理
_clickuploadel.innerText = "";
//添加flash按钮
U.UF.UP.addFlashUploadBottom(_clickuploadel, "flashupload", { "width": _clickuploadel.clientWidth, "height": _clickuploadel.offsetHeight }, {
error: U.MD.UI.flashError, //错误处理回调函数
/**
* 选择文件回调函数
* @param {array} filesinfo
*/
select: function (filesinfo) {
U.MD.UI.flashSelect(filesinfo, _url, U.UF.C.isFunction(_hashcallback)); //选择文件的处理
},
/**
* 上传文件获取文件流后的处理
* @param {string} 文件的md5值
* @param {string} 需要上传的文件的唯一识别id
*/
getHashCallBack: function (md5, fileid) {
var _fileinfo = U.MD.UI.getFileInfoById(fileid)[0];
//判断获取hash
_hashcallback(md5, _fileinfo, function (isupload) {
//判断是否上传的处理
if (isupload) { //如果md5匹配后还是要求上传,那么这里就处理上传
//直接执行文件的上传处理
U.UF.UP.flashUpload($("*flashupload")[0], fileid, _url);
}
else { //否则执行下一个上传的处理
U.MD.UI.flashContinueUpload(fileid, _url, U.UF.C.isFunction(_hashcallback));
}
});
},
progress: U.MD.UI.progress, //上传文件的进度条处理
uploadComplete: U.MD.UI.flashUploadComplete, //单个文件上传成功的回调函数
//单个文件上传成功后,得到服务器的响应值处理,和CP不一样的是这里是得到了返回值,上面的只是文件已经传输到服务器了。
/**
* 上传文件成功返回上传文件值
* @param {object} 获取服务器返回值
* @param {string} 上传文件的唯一识别id
*/
getData: function (r, fileid) {
if (U.UF.C.isFunction(_cb)) {
_cb(r, U.MD.UI.getFileInfoById(fileid)[0]);
}
//否则执行下一个上传的处理
U.MD.UI.flashContinueUpload(fileid, _url, U.UF.C.isFunction(_hashcallback));
},
endUpload: U.MD.UI.deleteUploadAllFile //结束上传后释放资源
}, "*");
}
/**
* input上传
* @param {string} url为服务器地址
* @param {function} 回调函数
* @param {function} 判断hash值回调函数
* 回调函数返回结果:url为服务器地址返回的值。
*/
U.MD.UI.upload.input = function (url, cb, hashcallback) {
U.MD.UI.create(); //创建传出上传框
var _clickuploadel = U.selectEl("#U_MD_UI_UP_DRT")[0]; //获取上传按钮的处理
_clickuploadel.innerText = "";
//创建一个input file
$$("input", {
"multiple": "true", "type": "file", "accept": "*/*", "onchange": U.MD.UI.inputSelect,
"style": { "cssText": "display: block; position: relative; width: 100%; height: 100%; cursor: pointer; border: 0; color: #666; background: #eee; -moz-user-select: -moz-none; -webkit-user-select: none; opacity: 0; filter: alpha(opacity=0); -moz-opacity: 0;" }
}, _clickuploadel);
}
/**
* 初始化创建上传弹框
*/
U.MD.UI.create = function () {
var _flashtop = U.selectEl("#U_MD_UI_UP_O")[0];
if (_flashtop) {
U.UF.F.windowTopCenter(_flashtop); //居中弹出
}
else {
var _uploadel,
_topel,
_titleel,
_bottom,
_switchel;
_uploadel = $$("div", { "id": "U_MD_UI_UP", "className": "U_MD_UI_UP" });
_topel = $$("div", { "className": "U_MD_UI_UP_O" }, _uploadel);
//头部
_titleel = $$("div", { "className": "U_MD_UI_UP_T" }, _topel);
$$("div", { "className": "U_MD_UI_UP_TO", "innerHTML": "普通上传" }, _titleel);
$$("div", { "className": "U_MD_UI_UP_Z", "innerHTML": "提示声明: 严谨上传包括反动、暴力、色情、违法及侵权内容的文件;严格遵守保密法律法规,任何危害用户或犯法的行为,都必须受到法律追究。" }, _topel);
//文件上传区域
$$("div", { "id": "U_MD_UI_UP_C", "className": "U_MD_UI_UP_C" }, _topel);
//底部
_bottom = $$("div", { "className": "U_MD_UI_UP_D" }, _topel);
_switchel = $$("div", { "className": "U_MD_UI_UP_DR" }, _bottom);
$$("div", { "className": "U_MD_UI_UP_DRO", "innerHTML": "点击上传" }, _switchel);
$$("div", { "className": "U_MD_UI_UP_DRO U_MD_UI_UP_DRT", "id": "U_MD_UI_UP_DRT" }, _switchel);
//弹出上传框
return new U.UF.UI.form("
上传
", _uploadel, {
"id": "U_MD_UI_UP_O",
"style": { "width": "700px", "height": "560px" },
"ondrop" :"U.MD.DK.C.Dropload()",
"ondragover":"event.preventDefault()",
}, { isnarrow: false, isenlarge: false }).form;
}
}
/**
* 获取上传文件所在的位置
* @param {string} 上传文件的id
* @return {array} 上传文件的位置及信息
* 0 找到上传文件的信息
* 1 上传文件在一个flashfiles的位置
* 2 上传文件在多个flashfiles中其中一个flashfiles的位置
*/
U.MD.UI.getFileInfoById = function (fileid) {
var i, j,
_allfiles = U.MD.UI.upload.uploadFileInfo; //用户需要上传的所有文件
for (i = 0; i < _allfiles.length; i++) {
j = _allfiles[i].objIndexOf({ "fileid": fileid }); //根据fileid在_allfiles[i]数组的查找获取fileid = fileid的上传文件信息
//找到该上传文件
if (j > -1) {
/*
* 0 找到上传文件的信息
* 1 上传文件在一个flashfiles的位置
* 2 上传文件在多个flashfiles中其中一个flashfiles的位置
*/
return [_allfiles[i][j], j, i];
}
}
return [null, -1, -1]; //返回未找到的信息
}
//#endregion
//#region html5- input上传
U.MD.UI.inputSelect = function () {
}
//#endregion
//#region html5 input上传处理
/**
* 生成上传的点击框
* @param event 当input内容改变时触发函数
*/
U.MD.UI.inputSelect = function (callback) {
//获取input控件
var event = window.event || arguments.callee.caller.arguments[0];
var _fileinfo,
_fileinfos = [],
_files = event.target.files; //所有上传的文件
if (event.target.files==undefined) //为空则不是通过input上传的文件
_files = event.dataTransfer==undefined?undefined:event.dataTransfer.files; //读取拖拽上传的文件
if(_files==undefined)
return false;
//遍历input的文件
for (var i = 0; i < _files.length; i++) {
_fileinfos.push(_files[i]); //加入待上传文件信息
}
U.MD.UI.upload.uploadFileInfo.push(_fileinfos); //添加上传的处理
U.MD.UI.printUploadFiles(_fileinfos); //生成前台UI
U.MD.UI.inputUpload(_fileinfos[0], callback); //调用上传
}
/*
生成文件信息
* @param {file} file文件
*/
//U.MD.UI.inputFileInfo = function (input) {
// var _return = {
// "creationDate": input.lastModifiedDate,
// "creator": null,
// "data": null,
// "modificationData": input.lastModifiedDate,
// "name": input.name,
// "size": input.size,
// "type": U.UF.UP.getFileNameAndExtension(input.name)[1]
// }
// return _return;
//}
/**
* input上传处理的全过程
* @param event 当input内容改变时触发函数
*/
U.MD.UI.inputUpload = function (file, callback) {
file.isupload = true; //设置上传状态为true
//进行文件加密 回调参数(进度,完成,文件hash)
U.UF.UP.html5Upload.fileMd5(file, function (progress, finish, filehash) {
//发生错误的处理
if (!progress) {
//错误处理
if (U.UF.C.isFunction(callback.error)) {
callback.error(finish);
}
}
//判断是否解析完成
else if (finish) {
callback.progress({ "Loaded": 1, "Total": 1 }, file.fileid, ""); //生成进度条
//获取hash后的回调处理
if (U.UF.C.isFunction(callback.getHashCallBack)) {
callback.getHashCallBack(filehash, file, callback);
}
}
//未解析完毕进度条处理
else {
if (U.UF.C.isFunction(callback.progress)) {
callback.progress(progress, file.fileid, "解析中"); //生成进度条
}
}
});
}
//#endregion
//#region flash上传处理的过程
/**
* 上传框用户选择完文件的处理
* @param {array} 需要加载上传框的元素
*/
U.MD.UI.flashSelect = function (uploadfiles, url, isgethash) {
U.MD.UI.printUploadFiles(uploadfiles, true); //打印上传的内容
U.MD.UI.upload.uploadFileInfo.push(uploadfiles); //添加上传的信息处理
U.MD.UI.flashUpload(uploadfiles[0], url, isgethash); //上传处理
}
/**
* 上传的处理,如果有处理hash的那么就调用hash的回调
* @param {array} 需要加载上传框的元素
*/
U.MD.UI.flashUpload = function (uploadfile, url, isgethash) {
var _flashbottom = U.selectEl("*flashupload")[0], //上传按钮
_fileid = uploadfile.fileid //上传文件的唯一识别id
;
uploadfile.isupload = true; //设置上传状态为true
//如果需要处理获取hash值的处理
if (isgethash) {
//上传前,先得到hash的值,进行判断是否文件已经存在
U.UF.UP.generateFileHash($("*flashupload")[0], _fileid); //获取hash
}
//文件直接上传的处理
else {
//直接执行文件的上传处理
U.UF.UP.flashUpload(_flashbottom, _fileid, url);
}
}
/**
* 文件单个上传完毕
* @param {string} 上传文件的唯一识别id
*/
U.MD.UI.flashUploadComplete = function (fileid) {
// U.alert("传输完成,等待返回。");
}
/**
* 所有文件上传完的处理
*/
U.UF.UP.deleteUploadAllFile = function () {
}
/**
* 清空上传框处理
*/
U.MD.UI.flashEmptyUpload = function (el) {
var _flashbottom = U.selectEl("*flashupload")[0];
if (_flashbottom) {
U.UF.UP.deleteUploadAllFile(_flashbottom); //清理flash上传的资源
}
}
/**
* 获取上传文件所在的位置
* @param {object} 错误消息
* @return {array} 上传文件的位置及信息
* 0 上传文件在一个flashfiles的位置
* 1 上传文件在多个flashfiles中其中一个flashfiles的位置
* 2 找到上传文件的信息
*/
U.MD.UI.flashError = function (errorinfo) {
if (errorinfo.message) { //有错误消息
var _meeage = "上传处理失败:" + errorinfo.message; //上传错误信息
if (UE.errorID == 1502) { //当错误编码是1502时候我们弹出用户可理解的错误
_meeage = "文件太大,电脑内存不足";
}
U.alert(_meeage); //弹出错误
U.UF.C.console(errorinfo); //控制台输出错误
}
}
//#endregion
//#region 统一处理
/**
* 打印上传的信息
* @param {array} 上传的文件数组
*/
U.MD.UI.printUploadFiles = function (uploadfiles, isflash) {
var _type,
_info,
_uploaddiv,
_panel,
_panel_one,
_progressel,
_uploadcontent = U.selectEl("#U_MD_UI_UP_C"),
_frag = $$("frag");
//循环打印上传的文件信息
for (i = 0; i < uploadfiles.length; i++) {
uploadfiles[i].fileid = Guid.newGuid(); //设置上传文件的id
_type = U.UF.UP.getFileNameAndExtension(uploadfiles[i]["name"])[1]; //获取上传文件的后缀
//创建上传文件的信息
_uploaddiv = $$("div", { "className": "U_MD_UI_UP_CO" }, _frag);
_panel = $$("div", { "className": "U_MD_UI_UP_COO" }, _uploaddiv);
_panel_one = $$("div", { "className": "U_MD_UI_UP_COI U_Img ", "style": { "cssText": "background-position:-12px 1px"} }, _panel);
$$("div", { "className": "U_MD_UI_UP_COION", "innerHTML": _type }, _panel_one);
_panel_one = $$("div", { "className": "U_MD_UI_UP_COT" }, _panel);
$$("div", { "className": "U_MD_UI_UP_COTS U_MD_D_Text_Abbreviation", "innerHTML": uploadfiles[i].name }, _panel_one);
$$("div", { "className": "U_MD_UI_UP_COTX", "innerHTML": "容量大小:" + U.UF.UP.minUnitToMaxUnit(uploadfiles[i]["size"]) }, _panel);
_panel_one = $$("div", { "className": "U_MD_UI_UP_COS U_MD_D_Text_Abbreviation" }, _panel);
$$("div", { "className": "U_MD_UI_UP_COSN", "innerHTML": "准备上传" }, _panel_one);
$$("div", { "className": "U_MD_UI_UP_COSI U_Img" }, _panel_one);
_panel_one = $$("div", { "className": "U_MD_UI_UP_COC U_MD_UI_UP_COX", "title": "等待响应..." }, _panel_one);
$$("img", { "onerror": U.MD.C.imgError, "src": US.DOMAIN + "img/ULG.gif" }, _panel_one);
$$("div", { "className": "U_MD_UI_UP_COX", "titlle": "点击撤销删除上传", "innerHTML": "撤销",
"onclick": function () {
U.MD.UI.delUploadFile(_uploaddiv, uploadfiles[0], isflash); // 移除当前上传元素,排队向下上传处理
}
}, _panel);
_progressel = $$("div", { "className": "U_MD_UI_UP_COU" }, _uploaddiv);
uploadfiles[i].fileel = _uploaddiv; //记录上传元素的框
uploadfiles[i].progressel = _progressel; //进度条元素
}
//添加上传的文件信息在中间上传区域
_uploadcontent.append(_frag);
}
/**
* 移除当前上传元素,排队向下上传处理
* @param {element} 需要移除的元素
* @param {object} 上传文件的信息
*/
U.MD.UI.delUploadFile = function (uploadel, uploadfile, isflash) {
var i, j,
_allfiles = U.MD.UI.upload.uploadFileInfo,
_fileinfo = U.MD.UI.getFileInfoById(uploadfile.fileid), //根据文件的id获取在U.MD.UI.FTF["FL"]中的位置及在U.MD.UI.FTF["FL"][i]中的位置
_allfilesnum = _fileinfo[2], //文件在U.MD.UI.FTF["FL"]中的位置
_filesnum = _fileinfo[1]; //文件在U.MD.UI.FTF["FL"][i]中的位置
U.selectEl(uploadel).remove(); //上传成功后删除上传的元素
if (_filesnum != -1) { //实体存在
//移除一个上传文件
_allfiles[_allfilesnum].splice(_filesnum, 1)[0];
//如果在移除的文件是该多个flash上传中的其中一个的最后一个上传,那么直接删除上传数组
if (!_allfiles[_allfilesnum].length) {
_allfiles.splice(_allfilesnum, 1);
}
//flash清楚上传处理
if (isflash) {
U.UF.UP.deleteUploadFile($("*flashupload")[0], _filesnum, _allfilesnum); //flash中删除上传。
}
//html5清除上传处理
else {
U.UF.UP.html5Upload.deleteUploadFile(uploadfile);
}
//判断上传文件的上传状态,如果是正在上传的文件删除,那么需要向下执行上传文件
if (uploadfile.isupload) {
//如果还有文件需要上传
if (_allfiles.length) {
//利用排队的方式执行文件上传
for (i = 0; i < _allfiles.length; i++) { //从所有的上传文件数组里排队
for (j = 0; j < _allfiles[i].length; j++) { //在fileslist中排队筛选
if (!_allfiles[i][j].isupload) { //如果该文件的状态没有在上传中,那么就直接上传
return _allfiles[i][j];
}
}
}
}
else {
//flash清理上传处理
if (isflash) {
U.MD.UI.flashEmptyUpload(); //清空上传框
}
else {
U.UF.UP.html5Upload.deleteUploadAllFile();
}
}
}
}
}
/**
* 上传文件进度条处理
* @param {object} 进度条的值 Loaded 现在的进度 Total 中进度
* @param {object} 上传文件的唯一识别id
* @param {object} 用md5去判断上传的文件是否需要上传
*/
U.MD.UI.progress = function (progress, fileid, msg) {
var _fileinfo = U.MD.UI.getFileInfoById(fileid)[0], //根据上传文件唯一识别的id获取上传文件的信息
_progresschilds = U.selectEl($(_fileinfo.fileel).childs(0).childs(0)[3]).Child(), //获取上传文件进度条元素
_progress = Math.floor((progress.Loaded / progress.Total) * 100); //获取进度的百分比
_fileinfo.progressel.style.width = _progress + "%"; //上传的进度样式
_progresschilds[0].innerText = msg; //上传信息提醒,包括准备上传、正在解析、上传中
_progresschilds[1].style.display = "none"; //上传成功后的
_progresschilds[2].style.display = "block"; //loading
}
/**
* 接续上传的处理
* @param {string} 上传文件的唯一识别id
*/
U.MD.UI.flashContinueUpload = function (fileid, url, isgethash) {
var _fileinfo = U.MD.UI.getFileInfoById(fileid)[0], //获取上传完的文件
_nextuploadfile = U.MD.UI.delUploadFile(_fileinfo.fileel, _fileinfo, true); //删除上传成功后的文件,得到下一个需要上传的文件
// 如果有下一个文件要上传的处理
if (_nextuploadfile) {
U.MD.UI.flashUpload(_nextuploadfile, url, isgethash); //调用上传,如果有hash的获取这里支持自动获取hash
}
}
//#endregion