'use strict';
function miniupload() {
var _body = jQuery('body');
var input_selector = '[aksrtupload="image_upload"]';
var submit_selector = '[aksrtupload="submit"]';
var form_selector = '.form-upload,.mini-upload,form';
var add_html = '
';
var add_selector = '.add';
var mini_file = {};
var pre_html;
_body.on('change', input_selector, function (e) {
var _this = jQuery(this);
var files = this.files || e.dataTransfer.files;
var form = jQuery(_this.parents(form_selector)[0]);
var size_max = _this.attr('size_max') || Number(_win.upload_img_size) || 3;
var pre_selector = _this.attr('data-preview') || '.preview';
var pre = form.find(pre_selector);
pre_html = pre.html();
var accept = _this.attr('accept'); //允许上传的文件类型
var multiple = _this.attr('multiple'); //是否允许多选
var multiple_max = _this.attr('multiple_max'); //多选最多允许几个
var accept_yanz = false;
if (-1 !== accept.indexOf('image')) {
accept_yanz = 'image';
}
if (-1 !== accept.indexOf('vedio')) {
accept_yanz = 'vedio';
}
var upload_id = _this.attr('upload_id');
//设置唯一ID标识
if (!_this.attr('upload_id')) {
upload_id = parseInt((Math.random() + 1) * Math.pow(10, 4));
_this.attr('upload_id', upload_id);
}
if (!mini_file[upload_id]) {
mini_file[upload_id] = [];
}
jQuery.each(files, function (key, val) {
var name = val.name;
if (accept_yanz && -1 == val.type.indexOf(accept_yanz)) {
//如果限制文件格式
notyf(aksrt_sprintf('upload_format_error', name), 'danger'), _this.val('');
} else if (size_max && val.size > size_max * 1048567) {
//限制文件大小
notyf(aksrt_sprintf('upload_size_exceeded', name, size_max), 'danger');
} else if (!pre.find('[preview-name="' + name + '"]').length) {
//不允许重复文件
mini_file[upload_id].push(val);
}
});
var a_file = [];
var ii = 1;
var empty = false;
jQuery.each(mini_file[upload_id], function (key, val) {
if (multiple_max && multiple_max < ii) {
//限制文件数量
notyf(aksrt_sprintf('upload_count_exceeded', multiple_max), 'danger');
return false;
} else {
ii++;
a_file.push(val);
ToB64(val, function (e) {
var img = '';
if (multiple) {
if (!empty) {
pre.html('');
empty = true;
}
var cloce = '';
img = '
' + img + cloce + '
';
pre.append(img).find(add_selector).remove();
if (multiple_max && multiple_max >= ii) {
pre.append(add_html);
}
} else {
pre.html(img);
}
});
}
});
mini_file[upload_id] = a_file;
form.find('[auto-submit]').click();
});
_body.on('click', '.preview-remove', function () {
var _this = jQuery(this);
var file_key = _this.attr('file-key');
var upload_id = _this.attr('upload-id');
_this.parent().animate(
{
width: 0,
},
200,
'swing',
function () {
var pre = jQuery(this).parent();
jQuery(this).remove();
mini_file[upload_id].splice(file_key, 1);
if (!pre.find(add_selector).length) {
pre.append(add_html);
}
}
);
return false;
});
_body.on('click', '.preview ' + add_selector, function () {
var _this = jQuery(this);
var form = jQuery(_this.parents(form_selector)[0]);
form.find(input_selector).click();
});
//提交表单
_body.on('click', submit_selector, function (e) {
var _this = jQuery(this);
if (_this.attr('disabled')) {
return false;
}
if (e.preventDefault) e.preventDefault();
else e.returnValue = false;
var _text = _this.html();
var form = jQuery(_this.parents(form_selector)[0]);
var _input = form.find(input_selector);
var formData = new FormData();
//循环插入文件
var is_files = _this.attr('aksrtupload-nomust');
_input.each(function () {
var _this = jQuery(this);
var upload_id = _this.attr('upload_id');
if (upload_id && mini_file[upload_id]) {
var ii = 0;
var tag = _this.attr('data-tag') || 'file';
jQuery.each(mini_file[upload_id], function (key, val) {
var append_tag = ii ? tag + '_' + ii : tag;
formData.append(append_tag, val, val.name);
ii++;
});
if (ii > 1) {
formData.append(tag + '_file_count', ii);
}
is_files = ii;
}
});
//必须选择图片判断
if (!is_files) return notyf(aksrt__('upload_select_first'), 'danger');
//添加其它数据
var serializeObject = form.serializeObject();
jQuery.each(serializeObject, function (key, val) {
formData.append(key, val);
});
//循环插入_POST内容
form.find('[data-name]').each(function () {
var _th = jQuery(this);
var n = _th.attr('data-name');
var v = _th.val() || _th.attr('data-value');
if (v === undefined) {
v = '';
}
if (formData.get(n) === null) {
formData.append(n, v);
}
});
//人机验证
if (formData.get('captcha_mode') && is_captcha(formData.get('captcha_mode'))) {
tbquire(['captcha'], function () {
CaptchaOpen(_this, formData.get('captcha_mode'));
});
return !1;
}
if (window.captcha) {
if (window.captcha._this) {
delete window.captcha._this;
}
formData.append('captcha', JSON.stringify(window.captcha));
window.captcha = {}; //只能使用一次
}
/**
for (var [a, b] of formData.entries()) {
console.log(a, b);
} */
var miniuploaded = function (no_preview_reset) {
_this.attr('disabled', false).html(_text);
_input
.attr('disabled', false)
.val('')
.each(function () {
var _this = jQuery(this);
var upload_id = _this.attr('upload_id');
if (upload_id && mini_file[upload_id]) {
mini_file[upload_id] = [];
}
});
if (!no_preview_reset && pre_html) {
form.find('.preview').html(pre_html);
}
};
var notyf_id = 'miniupload_ajax';
notyf(aksrt__('processing_wait'), 'load', '', notyf_id);
_this.attr('disabled', true).html('' + aksrt__('uploading') + '
');
_input.attr('disabled', true);
jQuery.ajax({
url: _win.ajax_url,
type: 'POST',
data: formData,
// 告诉jQuery不要去处理发送的数据
processData: false,
cache: false,
// 告诉jQuery不要去设置Content-Type请求头
contentType: false,
dataType: 'json',
error: function (n) {
var _msg = aksrt_sprintf('ajax_error', n.status, n.statusText);
if (aksrt_is_fatal_error_response(n.responseText)) {
_msg = aksrt__('ajax_fatal_error');
}
notyf(_msg, 'danger', '', notyf_id);
miniuploaded();
},
xhr: jqXhr(function (e) {
var percent = Math.round((e.loaded / e.total) * 100);
_this.find('count').html(percent + '%');
percent >= 100 && _this.find('.loading-text').html(aksrt__('upload_processing') + ' ...');
form.find('.progress .progress-bar').css('width', percent + '%');
}),
success: function (n) {
if (n.error) {
_win.slidercaptcha = false;
}
var ys = n.ys ? n.ys : n.error ? 'danger' : '';
notyf(n.msg || aksrt__('operation_success'), ys, '', notyf_id);
miniuploaded(n.no_preview_reset);
if (n.hide_modal) {
jQuery(_this.parents('.modal')[0]).modal('hide');
}
if (n.url && n.replace_img) {
jQuery('img' + n.replace_img).attr('src', n.url);
}
if (n.reload) {
if (n.goto) {
window.location.href = n.goto;
window.location.reload;
} else {
window.location.reload();
}
}
_this.trigger('miniuploaded', n, form);
},
});
});
//图片转Base64
function ToB64(e, n) {
if ('undefined' == typeof FileReader) return notyf(aksrt__('upload_unsupported'), 'danger');
var r = new FileReader();
r.readAsDataURL(e),
(r.onload = function (e) {
n && n(e.target.result);
});
}
//绑定上传进度
function jqXhr(fun) {
jqXhr.onprogress = fun;
//使用闭包实现监听绑
return function () {
//通过jQuery.ajaxSettings.xhr();获得XMLHttpRequest对象
var xhr = jQuery.ajaxSettings.xhr();
//判断监听函数是否为函数
if (typeof jqXhr.onprogress !== 'function') return xhr;
//如果有监听函数并且xhr对象支持绑定时就把监听函数绑定上去
if (jqXhr.onprogress && xhr.upload) {
xhr.upload.onprogress = jqXhr.onprogress;
}
return xhr;
};
}
}
if (!_win.is_miniupload) {
miniupload();
_win.is_miniupload = true;
}