"use strict";
!(function($) {
var pluginName = "ajaxImageUpload",
defaults = {
fileInput: '', // 上传按钮名,即input[type=file]的name值
postUrl: '', // POST上传地址
width: 150, // 图片宽度
height: 150, // 图片高度
imageUrl: [], // 已上传的图片连接
postData: {}, // 额外数据
allowZoom: true, // 是否允许缩放
allowType: ["gif", "jpeg", "jpg", "bmp", "png"],
maxNum: 5, // 最多允许上传个数
maxSize: 1, // 允许上传图片的最大尺寸,单位M
appendMethod: 'before', // 追加方式
before: $.noop, // 上传前回调函数
success: $.noop, // 上传成功时的回调函数
error: $.noop, // 上传失败时的回调函数
complete: $.noop, // 所有上传完成时的回调函数
delete: $.noop // 删除图片时的回调函数
};
function Plugin(element, options) {
this.element = element;
this.settings = $.extend({}, defaults, options);
this._defaults = defaults;
this._name = pluginName;
this.complete = true;
this.code = 0;
this.msg = '';
this.init();
}
Plugin.prototype = {
init: function() {
var $self = this,
$this = $(this.element),
$imageUrl = $self.settings.imageUrl;
$self.createSectionBox();
// 已经存在的图片先展示出来
if ($imageUrl.length > 0) {
for (var $i = 0; $i < $imageUrl.length; $i++) {
$self.createImageSection($imageUrl[$i]);
}
}
$this.find("input[type=file]").on('change', function() {
$self.selectFile();
});
},
/**
* 选择文件
* @returns {boolean}
*/
selectFile: function() {
var $self = this,
$this = $(this.element),
$maxNum = $self.settings.maxNum,
$maxSize = $self.settings.maxSize,
$postUrl = $self.settings.postUrl,
$fileInput = $self.settings.fileInput,
$before = $self.settings.before,
$complete = $self.settings.complete,
$uploadInput = $this.find("input[type=file]"),
$imageSection = $this.find('.ggy-image-section');
if (!$postUrl) {
$self.callError("300", "没有配置postUrl");
$self.resetFile();
return false;
}
if (!$fileInput) {
$self.callError("301", "没有配置fileInput");
$self.resetFile();
return false;
}
if ($before && $before() === false) {
$self.resetFile();
return false;
}
var $files = $uploadInput[0].files;
if ($files.length + $imageSection.length > $maxNum) {
$self.callError("302", "上传图片数目不能超过" + $maxNum + "个");
$self.resetFile();
return false;
}
for (var $i = 0; $i < $files.length; $i++) {
var $file = $files[$i];
if (!$self.isAllowFile($file)) {
$self.callError("303", $file.name + " 图片类型不支持");
$self.resetFile();
break;
}
if ($self.getFileSize($file) > $maxSize) {
$self.callError("304", '上传图片不能超过' + $maxSize + 'M,当前上传图片的大小为' + $fileSize.toFixed(2) + 'M');
$self.resetFile();
break;
}
$self.createImageSection();
$self.ajaxUpload($file);
}
if ($self.complete == true) {
$complete();
}
$self.resetFile();
},
/**
* 创建容器盒子
* @returns {*|jQuery|HTMLElement}
*/
createSectionBox: function() {
var $self = this,
$this = $(this.element),
$fileInput = $self.settings.fileInput,
$sectionBox = $("
"),
$uploadSection = $(""),
$modalSection = $(""),
$uploadIcon = $(""),
$uploadInput = $("");
$sectionBox.appendTo($this);
$uploadSection.appendTo($sectionBox);
$uploadIcon.appendTo($uploadSection);
$uploadInput.appendTo($uploadSection);
$modalSection.appendTo($sectionBox);
$modalSection.on('click', function(event) {
event.stopPropagation();
$modalSection.hide();
});
},
/**
* 创建上传图片容器片段
* @param $src
* @returns {*|jQuery|HTMLElement}
*/
createImageSection: function($src) {
var $self = this,
$this = $(this.element),
$width = $self.settings.width,
$height = $self.settings.height,
$fileInput = $self.settings.fileInput,
$allowZoom = $self.settings.allowZoom,
$appendMethod = $self.settings.appendMethod,
$sectionBox = $this.find(".ggy-section-box"),
$uploadSection = $this.find(".ggy-upload-section"),
$imageSection = $(""),
$imageShade = $(""),
$hiddenInput = $(""),
$imageShow = $("
");
if ($src) {
$imageShow = $("
");
}
$imageSection.css({ 'width':$width, 'height':$height });
$uploadSection.css({ 'width':$width, 'height':$height });
switch ($appendMethod) {
case "before":
$sectionBox.prepend($imageSection);
break;
case "after":
$uploadSection.before($imageSection);
break;
}
$hiddenInput.appendTo($imageSection);
$imageShow.appendTo($imageSection);
$imageShade.appendTo($imageSection);
$self.createDeleteNode($imageSection);
if ($src && $allowZoom === true) {
$self.createZoomNode($imageSection);
}
},
createDeleteNode: function($imageSection) {
var $self = this,
$this = $(this.element),
$modalSection = $this.find(".ggy-modal-section"),
$imageShow = $imageSection.find(".ggy-image-show"),
$deleteIcon = $(""),
$deleteBox = $(""),
$delete = $self.settings.delete;
$deleteIcon.appendTo($imageSection);
// 点击显示删除确认弹框
$imageSection.find(".ggy-delete-icon").on('click', function(event) {
event.stopPropagation();
$modalSection.html($deleteBox);
$modalSection.show();
});
// 确认删除
$deleteBox.find(".ggy-confirm-btn").on('click', function(event) {
event.stopPropagation();
$modalSection.hide();
$imageSection.remove();
$deleteBox.remove();
$delete($imageShow.attr('src'));
});
// 取消删除
$deleteBox.find(".ggy-cancel-btn").on('click', function(event) {
event.stopPropagation();
$modalSection.hide();
return false;
});
},
createZoomNode: function($imageSection) {
var $this = $(this.element),
$imageShow = $imageSection.find(".ggy-image-show"),
$modalSection = $this.find(".ggy-modal-section"),
$zoomIcon = $(""),
$zoomBox = $("");
$zoomBox.find('img').attr('src', $imageShow.attr('src'));
$zoomIcon.appendTo($imageSection);
// 点击显示弹出框
$imageSection.find(".ggy-zoom-icon").on('click', function(event) {
event.stopPropagation();
$modalSection.html($zoomBox);
$modalSection.show();
});
},
/**
* 上传文件
* @param $file
*/
ajaxUpload: function($file) {
var $self = this,
$this = $(this.element),
$fileInput = $self.settings.fileInput,
$postData = $self.settings.postData,
$postUrl = $self.settings.postUrl,
$allowZoom = $self.settings.allowZoom,
$success = $self.settings.success,
$appendMethod = $self.settings.appendMethod;
switch ($appendMethod) {
case "before":
var $imageSection = $this.find('.ggy-image-section:first');
var $imageShow = $this.find('.ggy-image-show:first');
break;
case "after":
var $imageSection = $this.find('.ggy-image-section:last');
var $imageShow = $this.find('.ggy-image-show:last');
break;
}
var $formData = new FormData();
$formData.append($fileInput, $file);
for (var $key in $postData) {
$formData.append($key, $postData[$key]);
}
$.ajax({
url: $postUrl,
type: 'post',
async: false,
data: $formData,
processData: false,
contentType: false,
headers: {'token': localStorage.getItem('token')},
dataType: 'json',
mimeType: "multipart/form-data",
success: function($json) {
if ($json.code != 200) {
$self.callError($json.code, $json.msg);
$imageSection.remove();
return false;
}
$imageShow.removeClass("shade").attr('src', $json.data.src);
$imageSection.find('input[type=hidden]').val($json.data.src);
if ($allowZoom === true) {
$self.createZoomNode($imageSection);
}
$self.complete *= true;
$success($json);
},
error: function(jqXHR, textStatus, errorThrown) {
$self.callError(jqXHR.status, 'AjaxUrl Service Error:' + jqXHR.statusText);
$imageSection.remove();
}
});
},
/**
* 是否允许上传文件
* @param $file
* @returns {boolean}
*/
isAllowFile: function($file) {
var $allowType = this.settings.allowType,
$fileExt = this.getFileExt($file);
if ($.inArray($fileExt, $allowType) != -1) {
return true;
}
return false;
},
/**
* 获取文件扩展名
* @param $file
* @returns {string}
*/
getFileExt: function($file) {
var $fileName = $file.name,
$index = $fileName.lastIndexOf('.');
if ($index < 1) {
return '';
}
return $fileName.substr($index + 1).toLowerCase();
},
/**
* 获取文件大小
* @param $file
* @returns {number}
*/
getFileSize: function($file) {
return ($file.size) / (1024 * 1024);
},
/**
* 重置上传域
*/
resetFile: function() {
$(this.element).find("input[type=file]").val(null);
},
/**
* 调用error函数
* @param $code
* @param $msg
*/
callError: function($code, $msg) {
var $self = this,
$error = $self.settings.error;
$self.complete *= false;
$self.code = $code;
$self.msg = $msg;
$error($self);
}
};
$.fn[pluginName] = function(options) {
return this.each(function() {
if (!$.data(this, "plugin_" + pluginName)) {
$.data(this, "plugin_" + pluginName, new Plugin(this, options));
}
});
};
})(jQuery, window, document);