|
|
/*global plupload */
|
|
|
/*global qiniu */
|
|
|
function FileProgress(file, targetID) {
|
|
|
this.fileProgressID = file.id;
|
|
|
this.file = file;
|
|
|
|
|
|
this.opacity = 100;
|
|
|
this.height = 0;
|
|
|
this.fileProgressWrapper = $('#' + this.fileProgressID);
|
|
|
if (!this.fileProgressWrapper.length) {
|
|
|
// <div class="progress">
|
|
|
// <div class="progress-bar progress-bar-info" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="width: 20%">
|
|
|
// <span class="sr-only">20% Complete</span>
|
|
|
// </div>
|
|
|
// </div>
|
|
|
|
|
|
this.fileProgressWrapper = $('<tr></tr>');
|
|
|
var Wrappeer = this.fileProgressWrapper;
|
|
|
Wrappeer.attr('id', this.fileProgressID).addClass('progressContainer');
|
|
|
|
|
|
var progressText = $("<td/>");
|
|
|
progressText.addClass('progressName').text(file.name);
|
|
|
|
|
|
|
|
|
var fileSize = plupload.formatSize(file.size).toUpperCase();
|
|
|
var progressSize = $("<td/>");
|
|
|
progressSize.addClass("progressFileSize").text(fileSize);
|
|
|
|
|
|
var progressBarTd = $("<td/>");
|
|
|
var progressBarBox = $("<div/>");
|
|
|
progressBarBox.addClass('info');
|
|
|
var progressBarWrapper = $("<div/>");
|
|
|
progressBarWrapper.addClass("progress progress-striped");
|
|
|
|
|
|
var progressBar = $("<div/>");
|
|
|
progressBar.addClass("progress-bar progress-bar-info")
|
|
|
.attr('role', 'progressbar')
|
|
|
.attr('aria-valuemax', 100)
|
|
|
.attr('aria-valuenow', 0)
|
|
|
.attr('aria-valuein', 0)
|
|
|
.width('0%');
|
|
|
|
|
|
var progressBarPercent = $('<span class=sr-only />');
|
|
|
progressBarPercent.text(fileSize);
|
|
|
|
|
|
var progressCancel = $('<a href=javascript:; />');
|
|
|
progressCancel.show().addClass('progressCancel').text('×');
|
|
|
|
|
|
progressBar.append(progressBarPercent);
|
|
|
progressBarWrapper.append(progressBar);
|
|
|
progressBarBox.append(progressBarWrapper);
|
|
|
progressText.append(progressCancel);
|
|
|
|
|
|
var progressBarStatus = $('<div class="status text-center"/>');
|
|
|
progressBarBox.append(progressBarStatus);
|
|
|
progressBarTd.append(progressBarBox);
|
|
|
|
|
|
Wrappeer.append(progressText);
|
|
|
Wrappeer.append(progressSize);
|
|
|
Wrappeer.append(progressBarTd);
|
|
|
|
|
|
$('#' + targetID).append(Wrappeer);
|
|
|
} else {
|
|
|
this.reset();
|
|
|
}
|
|
|
|
|
|
this.height = this.fileProgressWrapper.offset().top;
|
|
|
this.setTimer(null);
|
|
|
}
|
|
|
|
|
|
FileProgress.prototype.setTimer = function(timer) {
|
|
|
this.fileProgressWrapper.FP_TIMER = timer;
|
|
|
};
|
|
|
|
|
|
FileProgress.prototype.getTimer = function(timer) {
|
|
|
return this.fileProgressWrapper.FP_TIMER || null;
|
|
|
};
|
|
|
|
|
|
FileProgress.prototype.reset = function() {
|
|
|
this.fileProgressWrapper.attr('class', "progressContainer");
|
|
|
this.fileProgressWrapper.find('td .progress .progress-bar-info').attr('aria-valuenow', 0).width('0%').find('span').text('');
|
|
|
this.appear();
|
|
|
};
|
|
|
|
|
|
FileProgress.prototype.setChunkProgess = function(chunk_size) {
|
|
|
var chunk_amount = Math.ceil(this.file.size / chunk_size);
|
|
|
if (chunk_amount === 1) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var viewProgess = $('<button class="btn btn-default">查看分块上传进度</button>');
|
|
|
|
|
|
var progressBarChunkTr = $('<tr class="chunk-status-tr"><td colspan=3></td></tr>');
|
|
|
var progressBarChunk = $('<div/>');
|
|
|
for (var i = 1; i <= chunk_amount; i++) {
|
|
|
var col = $('<div class="col-md-2"/>');
|
|
|
var progressBarWrapper = $('<div class="progress progress-striped"></div');
|
|
|
|
|
|
var progressBar = $("<div/>");
|
|
|
progressBar.addClass("progress-bar progress-bar-info text-left")
|
|
|
.attr('role', 'progressbar')
|
|
|
.attr('aria-valuemax', 100)
|
|
|
.attr('aria-valuenow', 0)
|
|
|
.attr('aria-valuein', 0)
|
|
|
.width('0%')
|
|
|
.attr('id', this.file.id + '_' + i)
|
|
|
.text('');
|
|
|
|
|
|
var progressBarStatus = $('<span/>');
|
|
|
progressBarStatus.addClass('chunk-status').text();
|
|
|
|
|
|
progressBarWrapper.append(progressBar);
|
|
|
progressBarWrapper.append(progressBarStatus);
|
|
|
|
|
|
col.append(progressBarWrapper);
|
|
|
progressBarChunk.append(col);
|
|
|
}
|
|
|
|
|
|
if(!this.fileProgressWrapper.find('td:eq(2) .btn-default').length){
|
|
|
this.fileProgressWrapper.find('td>div').append(viewProgess);
|
|
|
}
|
|
|
progressBarChunkTr.hide().find('td').append(progressBarChunk);
|
|
|
progressBarChunkTr.insertAfter(this.fileProgressWrapper);
|
|
|
|
|
|
};
|
|
|
|
|
|
FileProgress.prototype.setProgress = function(percentage, speed, chunk_size) {
|
|
|
this.fileProgressWrapper.attr('class', "progressContainer green");
|
|
|
|
|
|
var file = this.file;
|
|
|
var uploaded = file.loaded;
|
|
|
|
|
|
var size = plupload.formatSize(uploaded).toUpperCase();
|
|
|
var formatSpeed = plupload.formatSize(speed).toUpperCase();
|
|
|
var progressbar = this.fileProgressWrapper.find('td .progress').find('.progress-bar-info');
|
|
|
if (this.fileProgressWrapper.find('.status').text() === '取消上传'){
|
|
|
return;
|
|
|
}
|
|
|
this.fileProgressWrapper.find('.status').text("已上传: " + size + " 上传速度: " + formatSpeed + "/s");
|
|
|
percentage = parseInt(percentage, 10);
|
|
|
if (file.status !== plupload.DONE && percentage === 100) {
|
|
|
percentage = 99;
|
|
|
}
|
|
|
|
|
|
progressbar.attr('aria-valuenow', percentage).css('width', percentage + '%');
|
|
|
|
|
|
if (chunk_size) {
|
|
|
var chunk_amount = Math.ceil(file.size / chunk_size);
|
|
|
if (chunk_amount === 1) {
|
|
|
return false;
|
|
|
}
|
|
|
var current_uploading_chunk = Math.ceil(uploaded / chunk_size);
|
|
|
var pre_chunk, text;
|
|
|
|
|
|
for (var index = 0; index < current_uploading_chunk; index++) {
|
|
|
pre_chunk = $('#' + file.id + "_" + index);
|
|
|
pre_chunk.width('100%').removeClass().addClass('alert alert-success').attr('aria-valuenow', 100);
|
|
|
text = "块" + index + "上传进度100%";
|
|
|
pre_chunk.next().html(text);
|
|
|
}
|
|
|
|
|
|
var currentProgessBar = $('#' + file.id + "_" + current_uploading_chunk);
|
|
|
var current_chunk_percent;
|
|
|
if (current_uploading_chunk < chunk_amount) {
|
|
|
if (uploaded % chunk_size) {
|
|
|
current_chunk_percent = ((uploaded % chunk_size) / chunk_size * 100).toFixed(2);
|
|
|
} else {
|
|
|
current_chunk_percent = 100;
|
|
|
currentProgessBar.removeClass().addClass('alert alert-success');
|
|
|
}
|
|
|
} else {
|
|
|
var last_chunk_size = file.size - chunk_size * (chunk_amount - 1);
|
|
|
var left_file_size = file.size - uploaded;
|
|
|
if (left_file_size % last_chunk_size) {
|
|
|
current_chunk_percent = ((uploaded % chunk_size) / last_chunk_size * 100).toFixed(2);
|
|
|
} else {
|
|
|
current_chunk_percent = 100;
|
|
|
currentProgessBar.removeClass().addClass('alert alert-success');
|
|
|
}
|
|
|
}
|
|
|
currentProgessBar.width(current_chunk_percent + '%');
|
|
|
currentProgessBar.attr('aria-valuenow', current_chunk_percent);
|
|
|
text = "块" + current_uploading_chunk + "上传进度" + current_chunk_percent + '%';
|
|
|
currentProgessBar.next().html(text);
|
|
|
}
|
|
|
|
|
|
this.appear();
|
|
|
};
|
|
|
|
|
|
FileProgress.prototype.setComplete = function(up, info) {
|
|
|
var td = this.fileProgressWrapper.find('td:eq(2)'),
|
|
|
tdProgress = td.find('.progress');
|
|
|
|
|
|
var res;
|
|
|
var url;
|
|
|
if(uploadConfig.saveType == "oss"){
|
|
|
url = "oss";
|
|
|
str = "<div class='success_text'>上传成功</div>";
|
|
|
}else{
|
|
|
res = $.parseJSON(info);
|
|
|
if (res.url) {
|
|
|
url = res.url;
|
|
|
str = "<div class='success_text'>上传成功</div>";
|
|
|
} else {
|
|
|
var domain = up.getOption('domain');
|
|
|
url = domain + encodeURI(res.key);
|
|
|
var link = domain + res.key;
|
|
|
str = "<div class='success_text'>上传成功</div>";
|
|
|
}
|
|
|
}
|
|
|
|
|
|
tdProgress.html(str).removeClass().next().next('.status').hide();
|
|
|
this.fileProgressWrapper.find('td:eq(0) .progressCancel').hide();
|
|
|
td.find('.status').hide();
|
|
|
angular.element(document.querySelector('angular-filemanager > div')).scope().fileNavigator.refresh();
|
|
|
};
|
|
|
FileProgress.prototype.setError = function() {
|
|
|
this.fileProgressWrapper.find('td:eq(2)').attr('class', 'text-warning');
|
|
|
this.fileProgressWrapper.find('td:eq(2) .progress').css('width', 0).hide();
|
|
|
this.fileProgressWrapper.find('button').hide();
|
|
|
this.fileProgressWrapper.next('.chunk-status-tr').hide();
|
|
|
};
|
|
|
|
|
|
FileProgress.prototype.setCancelled = function(manual) {
|
|
|
var progressContainer = 'progressContainer';
|
|
|
if (!manual) {
|
|
|
progressContainer += ' red';
|
|
|
}
|
|
|
this.fileProgressWrapper.attr('class', progressContainer);
|
|
|
this.fileProgressWrapper.find('td .progress').remove();
|
|
|
this.fileProgressWrapper.find('td:eq(2) .btn-default').hide();
|
|
|
this.fileProgressWrapper.find('td:eq(0) .progressCancel').hide();
|
|
|
};
|
|
|
|
|
|
FileProgress.prototype.setStatus = function(status, isUploading) {
|
|
|
if (!isUploading) {
|
|
|
this.fileProgressWrapper.find('.status').text(status).attr('class', 'status text-left');
|
|
|
}
|
|
|
};
|
|
|
|
|
|
// 绑定取消上传事件
|
|
|
FileProgress.prototype.bindUploadCancel = function(up) {
|
|
|
var self = this;
|
|
|
if (up) {
|
|
|
self.fileProgressWrapper.find('td:eq(0) .progressCancel').on('click', function(){
|
|
|
self.setCancelled(false);
|
|
|
self.setStatus("取消上传");
|
|
|
self.fileProgressWrapper.find('.status').css('left', '0');
|
|
|
up.removeFile(self.file);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
FileProgress.prototype.appear = function() {
|
|
|
if (this.getTimer() !== null) {
|
|
|
clearTimeout(this.getTimer());
|
|
|
this.setTimer(null);
|
|
|
}
|
|
|
|
|
|
if (this.fileProgressWrapper[0].filters) {
|
|
|
try {
|
|
|
this.fileProgressWrapper[0].filters.item("DXImageTransform.Microsoft.Alpha").opacity = 100;
|
|
|
} catch (e) {
|
|
|
// If it is not set initially, the browser will throw an error. This will set it if it is not set yet.
|
|
|
this.fileProgressWrapper.css('filter', "progid:DXImageTransform.Microsoft.Alpha(opacity=100)");
|
|
|
}
|
|
|
} else {
|
|
|
this.fileProgressWrapper.css('opacity', 1);
|
|
|
}
|
|
|
|
|
|
this.fileProgressWrapper.css('height', '');
|
|
|
|
|
|
this.height = this.fileProgressWrapper.offset().top;
|
|
|
this.opacity = 100;
|
|
|
this.fileProgressWrapper.show();
|
|
|
|
|
|
};
|