var jsonData = new Array(); //服务器返回的jsonData
var hasError = false;
var $parentobj = parent.$(parentObjName);
if ($parentobj.length == 0) {
$("#uploader").html("找不到对象!");
hasError = true;
}
//判断是否和父级页面域名一样
if (parent.location == self.location) {
$(".main").html("无效的请求!");
hasError = true;
}
//判断域名是否匹配
if (document.domain != parent.document.domain) {
$("#uploader").html("非法请求!");
hasError = true;
}
if (hasError) {
$("#uploader").html();
}
var defaultoptions = { fileType: "image", fileNumLimit: "1", fileSizeLimit: "0", fileSingleSizeLimit: "1024", extensions: ".gif,.jpg,.jpeg,.png", mimeTypes: "*/*", tableName: "", fieldName: "", watermark: false, thumbnail: false, thumbnailWidth: "200", thumbnailHeight: "200", sortByDate: true, sortByFileType: true, rename: true, savePath: "/Upload/", saveFileName: "", deleteRepeat: false, saveToAttachmentData: true, callBack: "", savePathObjName: "", guid: "" };
var uploadOptions = $parentobj.attr("data-upload-params")
defaultoptions = ExtendObject(defaultoptions, uploadOptions);
var sortByDate = defaultoptions.sortByDate; //是否按日期分类保存文件,如:/upload/images/2018/10/30/xxx.png的日期部分
var sortByFileType = defaultoptions.sortByFileType; //是否对文件分类,图片分到../images目录,其他文件分到/files目录。
var fileType = defaultoptions.fileType;
var savePath = defaultoptions.savePath;//文件保存根路径,不设置则默认为/upload
var saveFileName = defaultoptions.saveFileName; //文件保存名称,不需要填写文件后缀,不设置则由系统默认命名,需要rename设置为false时才有效。
var savePathObjName = defaultoptions.savePathObjName; //保存路径的对象,如果设置了则从父级的此对象中获取savePath,如savePathObjName:"#idName"
if (savePathObjName != "") {
var $savePathObjName = parent.$(savePathObjName);
if ($savePathObjName.length > 0) {
savePath = $savePathObjName.val();
}
}
var deleteRepeat = defaultoptions.deleteRepeat;//是否删除同名文件,
var saveToAttachmentData = defaultoptions.saveToAttachmentData;// 是否保存在附件表中进行管理,如果设置为true,需要对下面三个参数赋值
var tableName = defaultoptions.tableName; //附件对应的表名
var fieldName = defaultoptions.fieldName; //附件对应的字段名
var guid = defaultoptions.guid; //前端页面的guid
if (saveToAttachmentData) {
if (tableName == "") {
$("#uploader").html("无效的tableName参数!");
}
if (fieldName == "") {
$("#uploader").html("无效的fieldName参数!");
}
}
if (guid == "") {
var $parentGuid = parent.$("#Guid");
if ($parentGuid.length == 0) {
$("#uploader").html("页面中必须包含Id为Guid的对象!");
hasError = true;
}
guid = $parentGuid.val();
}
if (guid.length < 30) {
$("#uploader").html("guid值貌似不太对!");
hasError = true;
}
var fileNumLimit = defaultoptions.fileNumLimit; //文件总数限制
var uploadedNum = 1; //后台保存xuhao用
if (fileNumLimit > 0)
{
if (fileType == "images" || fileType == "files") {
if ($parentobj.attr("data-fileNumLimit")) {
fileNumLimit = $parentobj.attr("data-fileNumLimit");
}
}
}
var fileSizeLimit = defaultoptions.fileSizeLimit; //单位kb,总大小
var fileSingleSizeLimit = defaultoptions.fileSingleSizeLimit; //单位kb,单个文件大小
var extensions = defaultoptions.extensions;
var reg = new RegExp("[.]", "gm");
extensions = extensions.replace(reg, ""); //允许的文件后缀,不带点,多个用逗号分割。
var watermark = defaultoptions.watermark;
var thumbnail = defaultoptions.thumbnail;
var thumbnail_Width = defaultoptions.thumbnailWidth; //插件中预定义了thumbnailWidth和thumbnailHeight变量,这里加了下划线区分
var thumbnail_Height = defaultoptions.thumbnailHeight;
var rename = defaultoptions.rename; //是否重命名,选择重命名,则系统自动按yyy-mm-dd的格式命名。
var mimeTypes = defaultoptions.mimeTypes //mime类型"
if (typeof ($parentobj.attr("mimeTypes")) != "undefined") {
mimeTypes = $parentobj.attr("mimeTypes");
}
var callBack = defaultoptions.callBack; //父级页的回调
function CallBack(successNum) {
if (jsonData.length > 0) {
if (callBack != "") {
if (typeof (parent.window[callBack]) == "function") {
parent.window[callBack](jsonData);
}
}
else {
parent.UploadPaneledCallBack(parentObjName, jsonData)
}
}
CloseDialog();
}
function CloseDialog() //关闭弹出层
{
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
var __RequestVerificationToken = $("[name='__RequestVerificationToken']").eq(0).val();
jQuery(function () {
var $ = jQuery, // just in case. Make sure it's not an other libaray.
$wrap = $('#uploader'),
// 图片容器
$queue = $('
')
.appendTo($wrap.find('.queueList')),
// 状态栏,包括进度和控制按钮
$statusBar = $wrap.find('.statusBar'),
// 文件总体选择信息。
$info = $statusBar.find('.info'),
// 上传按钮
$upload = $wrap.find('.uploadBtn'),
// 没选择文件之前的内容。
$placeHolder = $wrap.find('.placeholder'),
// 总体进度条
$progress = $statusBar.find('.progress').hide(),
// 添加的文件数量
fileCount = 0,
// 添加的文件总大小
fileSize = 0,
// 优化retina, 在retina下这个值是2
ratio = window.devicePixelRatio || 1,
// 缩略图大小
thumbnailWidth = 110 * ratio,
thumbnailHeight = 110 * ratio,
// 可能有pedding, ready, uploading, confirm, done.
state = 'pedding',
// 所有文件的进度信息,key为file id
percentages = {},
supportTransition = (function () {
var s = document.createElement('p').style,
r = 'transition' in s ||
'WebkitTransition' in s ||
'MozTransition' in s ||
'msTransition' in s ||
'OTransition' in s;
s = null;
return r;
})(),
// WebUploader实例
uploader;
if (!WebUploader.Uploader.support()) {
alert('Web Uploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器');
throw new Error('WebUploader does not support the browser you are using.');
}
// 实例化
uploader = WebUploader.create({
pick: {
id: '#filePicker',
label: '选择上传文件'
},
dnd: '#uploader .queueList',
paste: document.body,
accept: {
title: 'Files',
extensions: extensions,
mimeTypes: mimeTypes
},
formData: {
upload: 1,
fieldName: fieldName,
tableName: tableName,
fileType: fileType,
watermark: watermark,
thumbnail: thumbnail,
thumbnailWidth: thumbnail_Width,
thumbnailHeight: thumbnail_Height,
rename: rename,
guid: guid,
uploadedNum: uploadedNum,
savePath: savePath,
saveFileName: saveFileName,
deleteRepeat: deleteRepeat,
saveToAttachmentData: saveToAttachmentData,
sortByDate: sortByDate,
sortByFileType: sortByFileType,
__RequestVerificationToken: __RequestVerificationToken
},
// swf文件路径
swf: BASE_URL + 'Uploader.swf',
disableGlobalDnd: true,
chunked: true,
server: serverUploadUrl,
fileNumLimit: fileNumLimit,
fileSizeLimit: fileSizeLimit * 1024, // 字节
fileSingleSizeLimit: fileSingleSizeLimit * 1024 //字节
});
// 添加“添加文件”的按钮,
uploader.addButton({
id: '#filePicker2',
label: '继续添加'
});
// 当有文件添加进来时执行,负责view的创建
function addFile(file) {
var $li = $('' +
'' + file.name + '
' +
'' +
'
' +
''),
$btns = $('' +
'删除' +
'向右旋转' +
'向左旋转
').appendTo($li),
$prgress = $li.find('p.progress span'),
$wrap = $li.find('p.imgWrap'),
$info = $(''),
showError = function (code) {
switch (code) {
case 'exceed_size':
text = '文件大小超出';
break;
case 'interrupt':
text = '上传暂停';
break;
default:
text = '上传失败,请重试';
break;
}
$info.text(text).appendTo($li);
};
if (fileCount >= fileNumLimit) {
if (fileNumLimit != 0) {
$("#filePicker2").hide();
}
}
if (file.getStatus() === 'invalid') {
showError(file.statusText);
} else {
// @todo lazyload
$wrap.text('预览中');
uploader.makeThumb(file, function (error, src) {
if (error) {
$wrap.text('');
return;
}
var img = $('');
$wrap.empty().append(img);
}, thumbnailWidth, thumbnailHeight);
percentages[file.id] = [file.size, 0];
file.rotation = 0;
}
file.on('statuschange', function (cur, prev) {
if (prev === 'progress') {
$prgress.hide().width(0);
} else if (prev === 'queued') {
$li.off('mouseenter mouseleave');
$btns.remove();
}
// 成功
if (cur === 'error' || cur === 'invalid') {
console.log(file.statusText);
showError(file.statusText);
percentages[file.id][1] = 1;
} else if (cur === 'interrupt') {
showError('interrupt');
} else if (cur === 'queued') {
percentages[file.id][1] = 0;
} else if (cur === 'progress') {
$info.remove();
$prgress.css('display', 'block');
} else if (cur === 'complete') {
$li.append('');
}
$li.removeClass('state-' + prev).addClass('state-' + cur);
});
$li.on('mouseenter', function () {
$btns.stop().animate({ height: 30 });
});
$li.on('mouseleave', function () {
$btns.stop().animate({ height: 0 });
});
$btns.on('click', 'span', function () {
var index = $(this).index(),
deg;
switch (index) {
case 0:
uploader.removeFile(file);
return;
case 1:
file.rotation += 90;
break;
case 2:
file.rotation -= 90;
break;
}
if (supportTransition) {
deg = 'rotate(' + file.rotation + 'deg)';
$wrap.css({
'-webkit-transform': deg,
'-mos-transform': deg,
'-o-transform': deg,
'transform': deg
});
} else {
$wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
// use jquery animate to rotation
// $({
// rotation: rotation
// }).animate({
// rotation: file.rotation
// }, {
// easing: 'linear',
// step: function( now ) {
// now = now * Math.PI / 180;
// var cos = Math.cos( now ),
// sin = Math.sin( now );
// $wrap.css( 'filter', "progid:DXImageTransform.Microsoft.Matrix(M11=" + cos + ",M12=" + (-sin) + ",M21=" + sin + ",M22=" + cos + ",SizingMethod='auto expand')");
// }
// });
}
});
$li.appendTo($queue);
}
// 负责view的销毁
function removeFile(file) {
var $li = $('#' + file.id);
delete percentages[file.id];
updateTotalProgress();
$li.off().find('.file-panel').off().end().remove();
if (fileCount < fileNumLimit) {
$("#filePicker2").show();
}
}
function updateTotalProgress() {
var loaded = 0,
total = 0,
spans = $progress.children(),
percent;
$.each(percentages, function (k, v) {
total += v[0];
loaded += v[0] * v[1];
});
percent = total ? loaded / total : 0;
spans.eq(0).text(Math.round(percent * 100) + '%');
spans.eq(1).css('width', Math.round(percent * 100) + '%');
updateStatus();
}
function updateStatus() {
var text = '', stats;
if (state === 'ready') {
text = '选中' + fileCount + '个文件,共' +
WebUploader.formatSize(fileSize) + '。';
} else if (state === 'confirm') {
stats = uploader.getStats();
if (stats.uploadFailNum) {
text = '已成功上传' + stats.successNum + '个文件,' +
stats.uploadFailNum + '个文件上传失败,重新上传失败文件或忽略'
}
} else {
stats = uploader.getStats();
text = '共' + fileCount + '个文件(' +
WebUploader.formatSize(fileSize) +
'),已上传' + stats.successNum + '个';
if (stats.uploadFailNum) {
text += ',失败' + stats.uploadFailNum + '个';
}
}
$info.html(text);
}
function setState(val) {
var file, stats;
if (val === state) {
return;
}
$upload.removeClass('state-' + state);
$upload.addClass('state-' + val);
state = val;
switch (state) {
case 'pedding':
$placeHolder.removeClass('element-invisible');
$queue.parent().removeClass('filled');
$queue.hide();
$statusBar.addClass('element-invisible');
uploader.refresh();
break;
case 'ready':
$placeHolder.addClass('element-invisible');
$('#filePicker2').removeClass('element-invisible');
$queue.parent().addClass('filled');
$queue.show();
$statusBar.removeClass('element-invisible');
uploader.refresh();
break;
case 'uploading':
$('#filePicker2').addClass('element-invisible');
$progress.show();
$upload.text('暂停上传');
break;
case 'paused':
$progress.show();
$upload.text('继续上传');
break;
case 'confirm':
$progress.hide();
$upload.text('开始上传').addClass('disabled');
stats = uploader.getStats();
if (stats.successNum && !stats.uploadFailNum) {
setState('finish');
return;
}
break;
case 'finish':
stats = uploader.getStats();
if (stats.successNum) {
//所有文件上传完毕后执行方法
CallBack(stats.successNum);
} else {
// 没有成功的图片,重设
state = 'done';
location.reload();
}
break;
}
updateStatus();
}
uploader.onUploadProgress = function (file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress span');
$percent.css('width', percentage * 100 + '%');
percentages[file.id][1] = percentage;
updateTotalProgress();
};
uploader.onFileQueued = function (file) {
fileCount++;
fileSize += file.size;
if (fileCount === 1) {
$placeHolder.addClass('element-invisible');
$statusBar.show();
}
addFile(file);
setState('ready');
updateTotalProgress();
};
uploader.onFileDequeued = function (file) {
fileCount--;
fileSize -= file.size;
if (!fileCount) {
setState('pedding');
}
removeFile(file);
updateTotalProgress();
};
var index = 0;
uploader.on('uploadSuccess', function (file, response) {
response = JsonParse(response);
if (response.State != 1) {
uploader.stop();
alert(response.Msg);
}
else {
var chunks = response.Chunks;
if (chunks > 1)
{
$.post("/E/UploadPanel/Merge", { guid: guid }, function (result)
{
});
}
jsonData[index] = { "path": response.Path, "thumbnail": response.Thumbnail, "name": response.Name };
index++;
}
});
uploader.on('all', function (type) {
var stats;
switch (type) {
case 'uploadFinished':
setState('confirm');
break;
case 'startUpload':
setState('uploading');
break;
case 'stopUpload':
setState('paused');
break;
}
});
uploader.onError = function (code) {
switch (code) {
case "Q_TYPE_DENIED":
layer.msg("对不起,只能上传" + extensions + "格式的文件!");
break;
case "F_DUPLICATE":
layer.msg('对不起,此文件已经选择!');
break;
case "Q_EXCEED_SIZE_LIMIT":
layer.msg("对不起,所有文件大小不能超过" + fileSizeLimit + "kb!");
break;
case "F_EXCEED_SIZE":
layer.msg("对不起,每个文件大小不能超过" + fileSingleSizeLimit + "kb!");
break;
case "Q_EXCEED_NUM_LIMIT":
layer.msg("对不起,只能选择" + fileNumLimit + "个文件!");
break;
default:
layer.msg(code);
break;
}
};
$upload.on('click', function () {
if ($(this).hasClass('disabled')) {
return false;
}
if (state === 'ready') {
uploader.upload();
} else if (state === 'paused') {
uploader.upload();
} else if (state === 'uploading') {
uploader.stop();
}
});
$info.on('click', '.retry', function () {
uploader.retry();
});
$info.on('click', '.ignore', function () {
alert('todo');
});
$upload.addClass('state-' + state);
updateTotalProgress();
});