Authored by zhaoqing

图片上传校验

var $ = require('jquery');
$.fn.ajaxfileupload = function(options) {
var settings = {
params: {},
action: '',
onStart: function() {},
onComplete: function(response) {},
onCancel: function() {},
validate_extensions: true,
valid_extensions: ['gif', 'png', 'jpg', 'jpeg'],
submit_button: null,
// 图片规格 width * heith,单位px, 默认不限制
valid_spec: false,
width_limit: 0,
height_limit: 0
};
var uploading_file = false;
if (options) {
$.extend(settings, options);
}
return this.each(function() {
var $element = $(this);
if ($element.data('ajaxUploader-setup') === true) return;
//
var ext = $element.attr("extend")
if (ext) {
settings.valid_extensions = ext.split(',');
}
var spec = $element.attr("spec");
if (spec) {
var array = spec.split('*');
if (array.length == 2) {
settings.width_limit = parseInt(array[0]);
settings.height_limit = parseInt(array[1]);
$.fn.ajaxfileupload = function (options) {
return this.each(function () {
var settings = {
params: {},
action: '',
onStart: function () { },
onComplete: function (response) { },
onCancel: function () { },
validate_extensions: true,
valid_extensions: ['gif', 'png', 'jpg', 'jpeg'],
// added by xuhongyun for upload limit
// 上传大小: 单位kb, 默认限制50mb
// size="500" spec="1500*1500"
size_limit: 200 * 1024,
// 图片规格 width * heith,单位px, 默认不限制
valid_spec: false,
width_limit: 0,
height_limit: 0,
// end added
submit_button: null
};
var uploading_file = false;
if (options) {
$.extend(settings, options);
}
if (settings.width_limit != 0 && settings.height_limit != 0) {
settings.valid_spec = true;
var $element = $(this);
if ($element.data('ajaxUploader-setup') === true) return;
//支持别的格式上传
var extend = $element.attr("extend");
if (extend) {
settings.valid_extensions = extend.split(',');
}
}
var bucket = $element.attr("bucket");
if(bucket){
settings.params.bucket=bucket;
}
console.log(settings.params);
$element.change(function() {
uploading_file = false;
if (settings.submit_button == null) {
upload_file();
}
});
if (settings.submit_button == null) {} else {
settings.submit_button.click(function(e) {
e.preventDefault();
if (!uploading_file) {
upload_file();
// add by xuhongyun for upload limit
var size = $element.attr("size");
if (size) {
settings.size_limit = parseInt(size);
}
});
}
var upload_file = function() {
if ($element.val() == '') return settings.onCancel.apply($element, [settings.params]);
var ext = $element.val().split('.').pop().toLowerCase();
console.log(settings.validate_extensions);
var files = $element[0].files;
if (files) {
$.each(files, function(index, file) {
// 加载图片,为了获取图片大小
var windowURL = window.URL || window.webkitURL;
var dataURL = windowURL.createObjectURL(file);
var frame_id = 'preview-' + Math.round(new Date().getTime());
$('<img id="' + frame_id +'" style="display:none" />').appendTo('body').attr("src", dataURL);
var img = $('#' + frame_id)[0];
// if (img.complete) {
// alert("加载完成");
// }
// else {
img.onload = function() {
// var width = img.offsetWidth,
// height = img.offsetHeight;
var width = $(img).width(),
height = $(img).height();
if (settings.valid_spec == true && (Math.abs(width - settings.width_limit) > 10 || Math.abs(height - settings.height_limit) > 10) )
{
// 图片规格超出限制
settings.onComplete.apply($element, [{
status: false,
message: '只允许上传' + settings.width_limit + '*' + settings.height_limit + '的文件,第' + (index+1) + '个文件不符合要求'
}, settings.params]);
var _$element = $element.clone();
var _$parent = $element.parent();
$element.remove();
_$parent.append(_$element);
_$element.ajaxfileupload(settings);
}
// 校验通过,上传至服务器
uploading_file = true;
// 记录文件的原始尺寸
settings.params.attrs = {
width: width,
height: height,
size: file.size
};
var ret = settings.onStart.apply($element, [settings.params]);
wrapElement($element);
if (ret !== false) {
$element.parent('form').submit(function (e) {
e.stopPropagation();
}).submit();
}
// }
};
if (file.size / 1024 > settings.size_limit) {
// 上传大小超出限制。
settings.onComplete.apply($element, [{
status: false,
message: '只允许上传大小' + settings.size_limit + 'KB以内的文件,第' + (index + 1) + '个文件不符合要求'
}, settings.params]);
var _$element = $element.clone();
var _$parent = $element.parent();
$element.remove();
_$parent.append(_$element);
_$element.ajaxfileupload(settings);
return;
}
});
}
if (true === settings.validate_extensions && $.inArray(ext, settings.valid_extensions) == -1) {
settings.onComplete.apply($element, [{
status: false,
message: '文件类型无效.只支持' + settings.valid_extensions.join(',')
}, settings.params]);
var _$element = $element.clone();
var _$parent = $element.parent();
$element.remove();
_$parent.append(_$element);
_$element.ajaxfileupload(settings);
} else {
uploading_file = true;
var ret = settings.onStart.apply($element, [settings.params]);
wrapElement($element);
if (ret !== false) {
$element.parent('form').submit(function(e) {
e.stopPropagation();
}).submit();
var spec = $element.attr("spec");
if (spec) {
var array = spec.split('*');
if (array.length == 2) {
settings.width_limit = parseInt(array[0]);
settings.height_limit = parseInt(array[1]);
}
if (settings.width_limit != 0 || settings.height_limit != 0) {
settings.valid_spec = true;
}
}
}
};
$element.data('ajaxUploader-setup', true);
var handleResponse = function(loadedFrame, element) {
var response, responseStr = $(loadedFrame).contents().text();
try {
response = JSON.parse(responseStr);
} catch (e) {
response = responseStr;
}
element.siblings().remove();
element.unwrap();
uploading_file = false;
settings.onComplete.apply(element, [response, settings.params]);
var _$element = $element.clone();
var _$parent = $element.parent();
$element.remove();
_$parent.append(_$element);
_$element.ajaxfileupload(settings);
};
var wrapElement = function(element) {
var frame_id = 'ajaxUploader-iframe-' + Math.round(new Date().getTime() / 1000)
$('body').after('<iframe width="0" height="0" style="display:none;" name="' + frame_id + '" id="' + frame_id + '"/>');
$('#' + frame_id).get(0).onload = function() {
handleResponse(this, element);
};
element.wrap(function() {
return '<form action="' + settings.action + '" method="POST" enctype="multipart/form-data" target="' + frame_id + '" />'
})
.before(function() {
var key, html = '';
for (key in settings.params) {
var paramVal = settings.params[key];
if (typeof paramVal === 'function') {
paramVal = paramVal();
// end added
var bucket = $element.attr("bucket");
if(bucket){
settings.params.bucket=bucket;
}
console.log(settings.params);
$element.change(function () {
uploading_file = false;
if (settings.submit_button == null) {
upload_file();
}
html += '<input type="hidden" name="' + key + '" value="' + paramVal + '" />';
}
html += '<input type="hidden" name="filename" value="' + $element.attr("name") + '" />'
return html;
});
}
});
if (settings.submit_button == null) { } else {
settings.submit_button.click(function (e) {
e.preventDefault();
if (!uploading_file) {
upload_file();
}
});
}
var upload_file = function () {
if ($element.val() == '') return settings.onCancel.apply($element, [settings.params]);
var ext = $element.val().split('.').pop().toLowerCase();
console.log(settings.validate_extensions);
// add by xuhongyun for upload limit
// 校验图片,非图片,直接跳过
var image_ext = ['gif', 'png', 'jpg', 'jpeg'];
if ($.inArray(ext, image_ext) > -1) {
var files = $element[0].files;
if (files) {
$.each(files, function (index, file) {
// 加载图片,为了获取图片大小
var windowURL = window.URL || window.webkitURL;
var dataURL = windowURL.createObjectURL(file);
var frame_id = 'preview-' + Math.round(new Date().getTime());
$('<img id="' + frame_id + '" style="display:none" />').appendTo('body').attr("src", dataURL);
var img = $('#' + frame_id)[0];
// 对文件大小做校验
if (file.size / 1024 > settings.size_limit) {
// 上传大小超出限制。
var message = '只允许上传大小' + settings.size_limit + 'KB以内的文件.';
if(files.length > 1) {
message += '第' + (index + 1) + '个文件不符合要求!'; // 这里,只有上传多张图片时,才提示不符合要求的图片索引;否则,在像店铺装修存在多个上传组件的情况下,容易造成误解
}
settings.onComplete.apply($element, [{
status: false,
message: message
}, settings.params]);
var _$element = $element.clone();
var _$parent = $element.parent();
$element.remove();
_$parent.append(_$element);
_$element.ajaxfileupload(settings);
return;
}
// 对文件尺寸做校验,异步加载
img.onload = function () {
var width = $(img).width(),
height = $(img).height();
// 对上传的图片大小进行校验
if (settings.valid_spec == true) {
var status = true;
var message;
if (settings.width_limit > 0) {
// 只限制宽度
if (settings.height_limit == 0) {
if (Math.abs(width - settings.width_limit) > 10) {
status = false;
message = '只允许上传宽度为' + settings.width_limit + '的图片.';
}
} else {
if (Math.abs(width - settings.width_limit) > 10 || Math.abs(height - settings.height_limit) > 10) {
status = false;
message = '只允许上传尺寸为' + settings.width_limit + '*' + settings.height_limit + '的图片.';
}
}
} else {
// 只限制高度
if (Math.abs(height - settings.height_limit) > 10) {
status = false;
message = '只允许上传高度为' + settings.height_limit + '的图片.';
}
}
if (status == false) {
// 图片规格超出限制
if(files.length > 1) {
message += '第' + (index + 1) + '个文件不符合要求!';
}
settings.onComplete.apply($element, [{
status: false,
message: message
}, settings.params]);
var _$element = $element.clone();
var _$parent = $element.parent();
$element.remove();
_$parent.append(_$element);
_$element.ajaxfileupload(settings);
return;
}
}
// 校验通过,上传至服务器
uploading_file = true;
// 记录文件的原始尺寸
settings.params.attrs = {
width: width,
height: height,
size: file.size
};
var ret = settings.onStart.apply($element, [settings.params]);
wrapElement($element);
if (ret !== false) {
$element.parent('form').submit(function (e) {
e.stopPropagation();
}).submit();
}
};
});
}
} else {
if (true === settings.validate_extensions && $.inArray(ext, settings.valid_extensions) == -1) {
settings.onComplete.apply($element, [{
status: false,
message: '文件类型无效.只支持' + settings.valid_extensions.join(',')
}, settings.params]);
var _$element = $element.clone();
var _$parent = $element.parent();
$element.remove();
_$parent.append(_$element);
_$element.ajaxfileupload(settings);
} else {
uploading_file = true;
var ret = settings.onStart.apply($element, [settings.params]);
wrapElement($element);
if (ret !== false) {
$element.parent('form').submit(function (e) {
e.stopPropagation();
}).submit();
}
}
}
};
$element.data('ajaxUploader-setup', true);
var handleResponse = function (loadedFrame, element) {
var response, responseStr = $(loadedFrame).contents().text();
try {
response = JSON.parse(responseStr);
} catch (e) {
response = responseStr;
}
element.siblings().remove();
element.unwrap();
uploading_file = false;
settings.onComplete.apply(element, [response, settings.params]);
var _$element = $element.clone();
var _$parent = $element.parent();
$element.remove();
_$parent.append(_$element);
_$element.ajaxfileupload(settings);
};
var wrapElement = function (element) {
var frame_id = 'ajaxUploader-iframe-' + Math.round(new Date().getTime() / 1000)
$('body').after('<iframe width="0" height="0" style="display:none;" name="' + frame_id + '" id="' + frame_id + '"/>');
$('#' + frame_id).get(0).onload = function () {
handleResponse(this, element);
};
element.wrap(function () {
return '<form action="' + settings.action + '" method="POST" enctype="multipart/form-data" target="' + frame_id + '" />'
})
.before(function () {
var key, html = '';
for (key in settings.params) {
var paramVal = settings.params[key];
if (typeof paramVal === 'function') {
paramVal = paramVal();
}
html += '<input type="hidden" name="' + key + '" value="' + paramVal + '" />';
}
html += '<input type="hidden" name="filename" value="' + $element.attr("name") + '" />'
return html;
});
}
});
}
... ...