方式一:同步等待所有媒体文件上传且下载完成的模式。
.layui-icon-close {
z-index: 1;
position: absolute;
color: red;
font-weight: bold;
cursor: pointer;
}
.layui-icon-play {
z-index: 1;
position: absolute;
color: white;
left: 50%;
transform: translateX(-50%);
font-weight: bold;
line-height: 100px;
font-size: 22px;
}
<div id="sqFileBox" colspan="3" style="height: 60px;">
<button style="background-color: #196eab;float: left;" type="button" class="layui-btn" id="uploadsqFile">
<i class="layui-icon"></i>上传
</button>
</div>
var sqFiles = [];
$(function() {
uploadsqFile('#uploadsqFile', sqFiles, $("#sqFileBox"))
})
function uploadsqFile(dom, fileArr, showDom) {
layui.use('upload', function() {
var element = layui.element;
var upload = layui.upload;
var uploadInst = upload.render({
elem: dom,
accept: 'file',
multiple: true,
acceptMime: 'image/*,video/*',
exts: 'jpg|jpeg|png|avi|mp4|rmvb',
size: 1024 * 500,
method: 'post',
headers: {
"stardon-token": getAuth()
},
url: lw_base_url + '/sysFile/upload',
progress: function(n, elem, res, index) {
var percent = n + '%'
element.progress('demo', percent);
element.progress('demo-' + index, n + '%');
},
before: function(obj) {
layer.open({
title: '上传中...',
closeBtn: 0,
btn: [],
content: '<div lay-filter="demo" class="layui-progress layui-progress-big" lay-showPercent="true"><div class="layui-progress-bar layui-bg-blue"></div></div>',
})
},
done: function(res) {
if (res.code == 0) {
res.data.loaded = false;
fileArr.push(res.data);
let suffix = res.data.fileName.slice(res.data.fileName.lastIndexOf('.') + 1)
.toLowerCase();
let timestamp = new Date().getTime();
if (suffix.match("jpg") || suffix.match("png") || suffix.match("jpeg")) {
showDom.append("<div id='" + res.data.fileKey +
"' style='display:inline;position:relative;float:left;margin:5px;'>" +
"<i οnclick='removesqFile(this.parentElement)' " +
"class='layui-icon layui-icon-close' />" +
"<img οnclick='checkImg(\"" + res.data.fileKey +
"\")' style='height:100px;'></div>")
} else {
showDom.append("<div id='" + res.data.fileKey +
"' style='display:inline;position:relative;float:left;margin:5px;'>" +
"<i οnclick='removesqFile(this.parentElement)' " +
"class='layui-icon layui-icon-close' />" +
"<div οnclick='playVideo(" + JSON.stringify(res.data.fileKey) +
")'><i class='layui-icon layui-icon-play' />" +
"<video style='height:100px;' src='" +
lw_base_url + "/sysFile/download?fileId=" + res.data.fileKey +
"' /></div></div>")
}
}
},
allDone: function(obj) {
mediaLoadFinish();
},
error: function() {
alert("上传失败!");
layer.closeAll();
}
});
});
}
var loadedMedia = 0;
function mediaLoadFinish() {
var mediaElements = document.querySelectorAll("img, video");
var totalMedia = mediaElements.length;
mediaElements.forEach(function(media, index) {
if (media.tagName === "IMG") {
media.src = lw_base_url + "/sysFile/download?fileId=" + sqFiles[index].fileKey;
media.onload = function() {
if (!sqFiles[index].loaded) {
loadedMedia++;
console.log("图片加载")
if (loadedMedia === totalMedia) {
layer.closeAll();
}
sqFiles[index].loaded = true;
}
};
} else if (media.tagName === "VIDEO") {
media.addEventListener("loadeddata", function() {
loadedMedia++;
console.log("视频加载")
if (loadedMedia === totalMedia) {
layer.closeAll();
}
});
media.addEventListener('error', function() {
loadedMedia++;
console.log("视频加载错误");
media.parentElement.onclick = function(){
window.open(media.src)
}
media.style.display = 'none';
var playBtn = media.parentElement.querySelector("i");
playBtn.style.display = 'none';
var videoFirstImg = document.createElement('img')
videoFirstImg.src = "../../../images/cant_play.png";
videoFirstImg.style.height = "100px";
media.parentElement.appendChild(videoFirstImg);
if (loadedMedia === totalMedia) {
layer.closeAll();
}
});
}
});
}
function removesqFile(obj) {
loadedMedia--;
$("#" + obj.id + "").remove();
sqFiles.forEach(function(item, index) {
if (item.fileKey == obj.id) {
sqFiles.splice(index, 1)
}
})
}
function checkImg(url) {
let imgList = [];
let start = 0;
let i = -1;
sqFiles.forEach((imgObj, index) => {
let suffix = imgObj.fileName.slice(imgObj.fileName.lastIndexOf(".") + 1).toLowerCase();
if (suffix.match("jpg") || suffix.match("png") || suffix.match("jpeg")) {
i += 1;
if (imgObj.fileKey == url) {
start = i;
}
let imgCheck = {
"src": lw_base_url + "/sysFile/download?fileId=" + imgObj.fileKey,
};
imgList.push(imgCheck);
}
});
layer.photos({
photos: {
"start": start,
"data": imgList,
},
anim: 5,
success: slideEnlargement(),
end: function() {},
});
}
function slideEnlargement() {
$(document).on("mousewheel", ".layui-layer-photos", function(ev) {
var oImg = this;
var ev = event || window.event;
var delta = ev.detail ? ev.detail > 0 : ev.wheelDelta < 0;
var ratioL = (ev.clientX - oImg.offsetLeft) / oImg.offsetWidth,
ratioT = (ev.clientY - oImg.offsetTop) / oImg.offsetHeight,
ratioDelta = !delta ? 1 + 0.1 : 1 - 0.1,
w = parseInt(oImg.offsetWidth * ratioDelta),
h = parseInt(oImg.offsetHeight * ratioDelta),
l = Math.round(ev.clientX - (w * ratioL)),
t = Math.round(ev.clientY - (h * ratioT));
$(".layui-layer-photos").css({
width: w,
height: h,
left: l,
top: t
});
$("#layui-layer-photos").css({
width: w,
height: h
});
});
}
function playVideo(url) {
layer.open({
area: ['80%', '90%'],
type: 1,
title: "视频播放",
content: "<video style='width: 100%;height:100%;' controls='controls' src='" +
lw_base_url + "/sysFile/download?fileId=" + url + "' />"
});
}
方式二:同步等待所有媒体文件上传,但下载异步的模式。(推荐,交互体验好)
.layui-icon-close {
z-index: 1;
position: absolute;
color: red;
font-weight: bold;
cursor: pointer;
}
.layui-icon-play {
z-index: 1;
position: absolute;
color: white;
left: 50%;
transform: translateX(-50%);
font-weight: bold;
line-height: 100px;
font-size: 22px;
}
.layui-icon-loading {
z-index: 1;
position: absolute;
color: white;
left: 50%;
transform: translateX(-50%);
font-weight: bold;
line-height: 100px;
font-size: 22px;
color: grey;
}
<div class="td_left" id="sqFileBox" colspan="3" style="height: 60px;">
<button style="background-color: #196eab;float: left;" type="button" class="layui-btn" id="uploadsqFile">
<i class="layui-icon"></i>上传
</button>
</div>
var sqFiles = [];
$(function() {
uploadsqFile('#uploadsqFile', sqFiles, $("#sqFileBox"))
})
function uploadsqFile(dom, fileArr, showDom) {
layui.use('upload', function() {
var element = layui.element;
var upload = layui.upload;
var uploadInst = upload.render({
elem: dom,
accept: 'file',
multiple: true,
acceptMime: 'image/*,video/*',
exts: 'jpg|jpeg|png|avi|mp4|rmvb',
size: 1024 * 500,
method: 'post',
headers: {
"stardon-token": getAuth()
},
url: lw_base_url + '/sysFile/upload',
progress: function(n, elem, res, index) {
var percent = n + '%'
element.progress('demo', percent);
element.progress('demo-' + index, n + '%');
},
before: function(obj) {
layer.open({
title: '上传中...',
closeBtn: 0,
btn: [],
content: '<div lay-filter="demo" class="layui-progress layui-progress-big" lay-showPercent="true"><div class="layui-progress-bar layui-bg-blue"></div></div>',
})
},
done: function(res) {
if (res.code == 0) {
fileArr.push(res.data);
let suffix = res.data.fileName.slice(res.data.fileName.lastIndexOf('.') + 1)
.toLowerCase();
let timestamp = new Date().getTime();
if (suffix.match("jpg") || suffix.match("png") || suffix.match("jpeg")) {
showDom.append("<div id='" + res.data.fileKey +
"' style='display:inline;position:relative;float:left;margin:5px;height:100px;width:100px;'>" +
"<i οnclick='removesqFile(this.parentElement)' " +
"class='layui-icon layui-icon-close' />" +
"<i class='layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop' />" +
"<img οnlοad='loadedImg(this)' οnclick='checkImg(\"" + res.data.fileKey +
"\")' src='" + lw_base_url +
"/sysFile/download?fileId=" + res.data.fileKey +
"' style='height:100px;'></div>");
} else {
showDom.append("<div id='" + res.data.fileKey +
"' style='display:inline;position:relative;float:left;margin:5px;height:100px;width:100px;'>" +
"<i οnclick='removesqFile(this.parentElement)' " +
"class='layui-icon layui-icon-close' />" +
"<i class='layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop' />" +
"<div οnclick='playVideo(" + JSON.stringify(res.data.fileKey) +
")'><i class='layui-icon layui-icon-play' />" +
"<video οnlοadeddata='loadedVideo(this)' οnerrοr='loadErrorVideo(this)' style='height:100px;display:none;' src='" +
lw_base_url + "/sysFile/download?fileId=" + res.data.fileKey +
"' /></div></div>");
}
}
},
allDone: function(obj) {
layer.closeAll();
},
error: function() {
alert("上传失败!");
layer.closeAll();
}
});
});
}
function loadedImg(imgDomObj) {
imgDomObj.parentElement.querySelector(".layui-icon-loading").style.display = 'none';
imgDomObj.parentElement.style.width = imgDomObj.style.width;
imgDomObj.style.display = "inline";
}
function loadedVideo(videoDomObj) {
videoDomObj.parentElement.parentElement.querySelector(".layui-icon-loading").style.display = 'none';
videoDomObj.parentElement.parentElement.style.width = videoDomObj.style.width;
videoDomObj.style.display = "inline";
}
function loadErrorVideo(videoDomObj) {
videoDomObj.parentElement.parentElement.querySelector(".layui-icon-loading").style.display = 'none';
videoDomObj.style.display = 'none';
var playBtn = videoDomObj.parentElement.querySelector("i");
playBtn.style.display = 'none';
var videoFirstImg = document.createElement('img')
videoFirstImg.src = "../../../images/cant_play.png";
videoFirstImg.style.height = "100px";
videoDomObj.parentElement.appendChild(videoFirstImg);
videoDomObj.parentElement.parentElement.style.width = videoFirstImg.style.width;
videoFirstImg.parentElement.onclick = function(){
window.open(videoDomObj.src)
}
}
function removesqFile(obj) {
$("#" + obj.id + "").remove();
sqFiles.forEach(function(item, index) {
if (item.fileKey == obj.id) {
sqFiles.splice(index, 1)
}
})
}
function checkImg(url) {
let imgList = [];
let start = 0;
let i = -1;
sqFiles.forEach((imgObj, index) => {
let suffix = imgObj.fileName.slice(imgObj.fileName.lastIndexOf(".") + 1).toLowerCase();
if (suffix.match("jpg") || suffix.match("png") || suffix.match("jpeg")) {
i += 1;
if (imgObj.fileKey == url) {
start = i;
}
let imgCheck = {
"src": lw_base_url + "/sysFile/download?fileId=" + imgObj.fileKey,
};
imgList.push(imgCheck);
}
});
layer.photos({
photos: {
"start": start,
"data": imgList,
},
anim: 5,
success: slideEnlargement(),
end: function() {},
});
}
function slideEnlargement() {
$(document).on("mousewheel", ".layui-layer-photos", function(ev) {
var oImg = this;
var ev = event || window.event;
var delta = ev.detail ? ev.detail > 0 : ev.wheelDelta < 0;
var ratioL = (ev.clientX - oImg.offsetLeft) / oImg.offsetWidth,
ratioT = (ev.clientY - oImg.offsetTop) / oImg.offsetHeight,
ratioDelta = !delta ? 1 + 0.1 : 1 - 0.1,
w = parseInt(oImg.offsetWidth * ratioDelta),
h = parseInt(oImg.offsetHeight * ratioDelta),
l = Math.round(ev.clientX - (w * ratioL)),
t = Math.round(ev.clientY - (h * ratioT));
$(".layui-layer-photos").css({
width: w,
height: h,
left: l,
top: t
});
$("#layui-layer-photos").css({
width: w,
height: h
});
});
}
function playVideo(url) {
layer.open({
area: ['80%', '90%'],
type: 1,
title: "视频播放",
content: "<video style='width: 100%;height:100%;' controls='controls' src='" +
lw_base_url + "/sysFile/download?fileId=" + url + "' />"
});
}