js
/*
0.思路步骤
1.点击[添加文件],选择文件
2.获取文件名称,拿后缀名判断文件类型
3.获取文件的type,是否符合类型,如果符合类型,类型标志位为true,不符合类型出弹窗,类型标志位为false
3.1.根据文件不同类型,显示相应的缩略图,文本类是默认相应图标,图片类是缩略图
4.获取文件的size,是否超出5M,如果在限制内,大小标志位为true,不符合则出弹窗,类型标志位为false
5.标志位都是true时,显示文件名、文件大小、已上传块,隐藏上传块
6.点击删除,显示弹窗,问是否确定删除
*/
/**
* 控制是否可以上传
* @type {boolean}
*/
let isUploadType = false,
isUploadSize = false,
isUploadLength = false,
globalFileObj = '';
/**
* 判断文件类型
* @param type 文件类型
*/
let typeHandler = {
'jpg': pigHandler,
'png': pigHandler,
'gif': pigHandler,
'jpeg': pigHandler,
'bmp': pigHandler,
'doc': docHandler,
'docx': docHandler,
'xls': docHandler,
'xlsx': docHandler,
'ppt': docHandler,
'pptx': docHandler,
'txt': docHandler,
};
// 文件上传
$("#file").on("change", function () {
// 当前所选文件
fileList(this.files);
});
// 进入拖放区域
$fileArea.on("dragenter", function () {
$(this).addClass('upFile--drag');
});
// 防止连续触发
$fileArea.on("dragover", function () {
return false;
});
// 离开目标容器
$fileArea.on("dragleave", function () {
$(this).removeClass('upFile--drag');
});
// 释放鼠标
$fileArea.on("drop", function (e) {
var file = e.originalEvent.dataTransfer.files;
fileList(file);
$(this).removeClass('upFile--drag');
return false;
});
// 删除文件
$('#delete').on('click', function () {
showPop('msg--delete');
});
// 确定删除文件
$('#deleteFile').on('click', function () {
hidePop();
$('.upFile--upload').show();
$('.upFile--delete').hide();
$("#file").val("");
})
/**
* 文件处理
* @param obj 文件对象
*/
function fileList(obj) {
// 获取当前的文件对象
let fileObj = obj[0],
fileName = fileObj.name,
fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length);
// 保存到全局
globalFileObj = fileObj;
// 判断文件类型
typeHandlerRoute(fileType);
// 判断文件大小
getFileLimit(fileObj);
// 判断文件个数
getFileLength(fileObj);
// 上传成功
if (isUploadType && isUploadSize && isUploadLength) {
$('.upFile--delete-name').html(fileName);
$('.upFile--delete-size').html(getFileLimit(fileObj));
$('.upFile--upload').hide();
$('.upFile--delete').show();
// 判断文件类型
typeHandlerRoute(fileType);
} else {
// TODO 上传失败
}
}
/**
* 图片处理器
* @param type 文件类型
*/
function pigHandler(type) {
thumbnail();
}
/**
* 文档处理器
* @param type 文件类型
*/
function docHandler(type) {
$('.upFile--delete-pic').attr('src', `./images/${type}.png`).addClass('pic--style');
}
/**
* 文件类型处理器路由
* @param type 路由类型
*/
function typeHandlerRoute(type) {
if (!typeHandler[type]) {
showPop("msg--type");
isUploadType = false;
return;
}
isUploadType = true;
typeHandler[type](type);
}
/**
* 判断文件大小
* @param fileObj 文件对象
*/
function getFileLimit(fileObj) {
let k = 1024,
limitSize = 5 * 1024 * 1024,
bytes = fileObj.size,
i = Math.floor(Math.log(bytes) / Math.log(k)),
sizes = ['B', 'KB', 'MB'];
if (bytes === 0) {
isUploadSize = false;
return '0B';
} else if (bytes > limitSize) {
showPop('msg--beyond');
isUploadSize = false;
return 0;
}
isUploadSize = true;
return ((bytes / Math.pow(k, i))).toFixed(1) + sizes[i];
}
/**
* 判断文件个数
* @param fileObj 文件对象
*/
function getFileLength(fileObj) {
if (fileObj.length > 1) {
alert('只能上传一个文件哦~');
isUploadLength = false;
return false;
} else {
isUploadLength = true;
}
}
/**
* 上传缩略图
*/
function thumbnail() {
// 缩略图
if (!window.FileReader) {
return;
}
// 创建FileReader对象
var reader = new FileReader();
// 读取file对象,读取完毕后会返回result ,图片base64格式的结果
reader.readAsDataURL(globalFileObj);
reader.onload = function (e) {
$('.upFile--delete-pic').attr('src', e.target.result);
}
}
pug
#fileArea.upFile
// 上传
.upFile--upload
img.upFile-img(src="images/icon_upFile.png", alt="上传文件")
| 点击
input#file(type="file")
label.upFile-input(for="file") 添加文件
|或将文件拖至此处
// 上传后
.upFile--delete
img.upFile--delete-pic(src="images/pic.png", alt="附件")
p.upFile--delete-line
span.upFile--delete-name 图片名称
span.upFile--delete-size 100KB
a#delete.upFile--delete-delete(title="删除", href="javascript:;") 删除
scss
.upFile {
position: relative;
width: 918px;
height: 165px;
border: 1px dashed #c1c1c1;
border-radius: 8px;
overflow: hidden;
&--delete {
display: none;
&-line {
margin-top: 5px;
margin-left: 23px;
}
&-pic {
@include mg(15, false, false, 23);
@include w-h(198, 112);
}
&-name {
@include w(16, #3f3f3f, false);
}
&-size {
@include w(14, #a1a1a1, false);
margin-left: 10px;
}
&-delete {
margin-left: 12px;
font-size: 16px;
text-decoration: underline;
cursor: pointer;
}
}
&--drag {
opacity: 0.5;
}
input {
position: absolute;
clip: rect(0 0 0 0);
}
&-input {
width: 75px;
height: 21px;
@include w(18, #f79024, false);
background: none;
cursor: pointer;
}
&-img {
@include abs(36, false, false, 21);
}
&-tip {
position: absolute;
left: 146px;
&-1 {
top: 44px;
@include w(18, #3f3f3f, false);
}
&-2 {
top: 76px;
@include w(14, #a1a1a1, false);
line-height: 1.5;
}
}
}