最近项目中有用到修改input file的默认样式及上传excel文件前台部分,这里总结下。
大致思路是隐藏原来的样式,然后在原来的样式上覆盖一个新样式。
导入样式

如果你觉得不错,可以使用下面素材。j记得将图片导入到你的项目中,路径也要对上。

我的实现为label标签
html代码
<label for="uploadFiles" id="uploadFiles2">导入</label>
<input type="file" id="uploadFiles" />
css代码
#uploadFiles {
position: absolute;
clip: rect(0, 0, 0, 0);
/*这2行是关键,脱离文档流 裁剪*/
}
#uploadFiles2 {
background: #ccc url(../img/in.png) no-repeat 10px -3px;
border: 1px solid #999;
bottom: 0px;
box-sizing: border-box;
cursor: pointer;
color: #666;
display: inline-block;
position: fixed;
padding-left: 32px;
margin-left: 250px;
left: 50%;
width: 100px;
height: 30px;
text-align: center;
line-height: 30px;
font-weight: 700;
font-size: 20px;
}
js 上传excel 文件代码 前台
后台得接收数据。并添加到数据库中即可。
var wb; //读取完成的数据
var rABS = false; //是否将文件读取为二进制字符串
var uploadFiles = document.getElementById("uploadFiles");
var fn = function(event) {
event = event||window.event;
event.stopPropagation();
var _this = event.target || event.srcElement;
importf(_this);
function importf(obj) { //导入
if(!obj.files) {
return;
}
var f = obj.files[0];
var reader = new FileReader();
reader.onload = function(e) {
var data = e.target.result;
if(rABS) {
wb = XLSX.read(btoa(fixdata(data)), { //手动转化
type: 'base64'
});
} else {
wb = XLSX.read(data, {
type: 'binary'
});
}
var ar = JSON.stringify(XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]));
$.ajax({
url: "selectContent",//记得换成自己的url
type: "post",
dataType: "json",
data: {
indata: ar //组装数据到后台
},
beforeSend: function() {
$("body").append("<progress class='progress'></progress>");
},
success: function(msg) {
$(".progress").remove();
alert("\u5bfc\u5165\u6210\u529f");
$("#uploadFiles").val(""); //解决onchange事件只能触发一次
},
error: function() {
alert("error!");
}
});
};
if(rABS) {
reader.readAsArrayBuffer(f);
} else {
reader.readAsBinaryString(f);
}
}
function fixdata(data) { //文件流转BinaryString
var o = "",
l = 0,
w = 10240;
for(; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)));
o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)));
return o;
}
};
$("#uploadFiles").on("change",fn);
input的onchange事件 bug
input file onchange事件上传文件有一个bug。就是只能触发一次,可以通过将input file的value值设置为空就可以解决。就能够触发多次onchange事件
$("#uploadFiles").val(""); //input