Bootstrap文件上传组件之bootstrap fileinput


Posted in Javascript onNovember 25, 2016

前言:之前的三篇介绍了下bootstrap的一些常用组件,发现博主对这种扁平化的风格有点着迷了。前两天做一个excel导入的功能,前端使用原始的input type='file'这种标签,效果不忍直视,于是博主下定决心要找一个好看的上传组件换掉它。既然bootstrap开源,那么社区肯定有很多关于它的组件,肯定也有这种常见的上传组件吧。经过一番查找,功夫不负有心人,还是被博主找到了这个组件:bootstrap fileinput。在此记录下,就算做个学习笔记,也给需要使用的朋友提供点方便。

Bootstrap组件系列文章:

bootstrap-fileinput在线API:http://plugins.krajee.com/file-input

bootstrap-fileinput Demo展示:http://plugins.krajee.com/file-basic-usage-demo

1、html页面

首先引入需要的js和css文件。

<link href="~/Content/bootstrap-fileinput/css/fileinput.min.css" rel="stylesheet" />
<script src="~/Content/bootstrap-fileinput/js/fileinput.min.js"></script>
<--中文包-->
<script src="~/Content/bootstrap-fileinput/js/fileinput_locale_zh.js"></script>

当然,既然是bootstrap的组件,它肯定需要bootstrap.js的支持。然后需要jquery的支持。

然后定义input type='file'标签

<input type="file" name="txt_file" id="txt_file" multiple class="file-loading" />

multiple表示允许同时上传多个文件,class=“file-loading”表示标签的样式。这里很重要,如果class="file",则中文化不能生效。

2、js初始化

$(function () {
//0.初始化fileinput
var oFileInput = new FileInput();
oFileInput.Init("txt_file", "/api/OrderApi/ImportOrder");
});
//初始化fileinput
var FileInput = function () {
var oFile = new Object();

//初始化fileinput控件(第一次初始化)
oFile.Init = function(ctrlName, uploadUrl) {
var control = $('#' + ctrlName);

//初始化上传控件的样式
control.fileinput({
language: 'zh', //设置语言
uploadUrl: uploadUrl, //上传的地址
allowedFileExtensions: ['jpg', 'gif', 'png'],//接收的文件后缀
showUpload: true, //是否显示上传按钮
showCaption: false,//是否显示标题
browseClass: "btn btn-primary", //按钮样式 
//dropZoneEnabled: false,//是否显示拖拽区域
//minImageWidth: 50, //图片的最小宽度
//minImageHeight: 50,//图片的最小高度
//maxImageWidth: 1000,//图片的最大宽度
//maxImageHeight: 1000,//图片的最大高度
//maxFileSize: 0,//单位为kb,如果为0表示不限制文件大小
//minFileCount: 0,
maxFileCount: 10, //表示允许同时上传的最大文件个数
enctype: 'multipart/form-data',
validateInitialCount:true,
previewFileIcon: "<i class='glyphicon glyphicon-king'></i>",
msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}!",
});

//导入文件上传完成之后的事件
$("#txt_file").on("fileuploaded", function (event, data, previewId, index) {
$("#myModal").modal("hide");
var data = data.response.lstOrderImport;
if (data == undefined) {
toastr.error('文件格式类型不正确');
return;
}
//1.初始化表格
var oTable = new TableInit();
oTable.Init(data);
$("#div_startimport").show();
});
}
return oFile;
};

说明:

(1)fileinput()方法里面传入的是一个json数据,它里面有很多属性,每个属性代表着初始化上传控件的时候的特性,如果这些属性都不设置,则表示使用默认的设置。如果园友们想看看它里面有哪些属性,可以打开fileinput.js的源码,在它的最后如图:

Bootstrap文件上传组件之bootstrap fileinput

这些属性如果不特意设置,就会使用默认值。

(2)$("#txt_file").on("fileuploaded", function (event, data, previewId, index) {}这个方法注册上传完成后的回调事件。也就是后台处理上传的文件之后会进到这个方法里面。经过以上简单的初始化,就可以得到上述示例图片中的效果。

3、后台对应的方法

还记得在js里面初始化控件方法fileinput()里面有一个参数url吗,这个url对应的值就指示后台对应的处理方法,还是贴出后台的处理方法。(以下为C#示例,如果你的后台语言不是C#,可以定义自己的后台方法)

[ActionName("ImportOrder")]
public object ImportOrder()
{
var oFile = HttpContext.Current.Request.Files["txt_file"];
var lstOrderImport = new List<DTO_TO_ORDER_IMPORT>();
#region 0.数据准备
var lstExistOrder = orderManager.Find();
var lstOrderNo = lstExistOrder.Select(x => x.ORDER_NO).ToList();
var lstTmModel = modelManager.Find();
var lstTmMaterial = materialManager.Find();
//var iMax_Import_Index = lstExistOrder.Max(x => x.IMPORT_INDEX);
//iMax_Import_Index = iMax_Import_Index == null ? 0 : iMax_Import_Index.Value;
#endregion
#region 1.通过Stream得到Workbook对象
IWorkbook workbook = null;
if (oFile.FileName.EndsWith(".xls"))
{
workbook = new HSSFWorkbook(oFile.InputStream);
}
else if(oFile.FileName.EndsWith(".xlsx"))
{
workbook = new XSSFWorkbook(oFile.InputStream);
}
if (workbook == null)
{
return new { };
}
//...............处理excel的逻辑
//orderManager.Add(lstOrder);
lstOrderImport = lstOrderImport.OrderBy(x => x.IMPORT_STATU).ToList();
return new { lstOrderImport = lstOrderImport };
}

由于博主的项目是上传excel,所以这里用的是NPOI处理Excel的逻辑,如果是上传图片等文件,可以使用GDI去处理图片。

4、同时上传多个文件

同时上传多个文件的时候,前台会发送多个异步的请求到后台,也就是说,当同时上传三个文件的时候,后台的ImportOrder方法会进入三次。这样就能使用多线程同时去处理三个文件。这个博主就不做示例了,有兴趣的朋友可以自行研究下。

三、总结

关于bootstrap fileinput的基础使用大概就介绍完了,其实就是一个上传的组件,也不存在什么高级用法。重点是把界面做得更加友好,更好的增加用户体验。需要说明的是,组件对IE浏览器的要求比较高,应该最少要IE9以上,还有就是拖拽上传功能在IE浏览器的体验不太好。

如果你的项目也需要文件上传,不妨试试这个,需要测试Demo或者有什么问题可以随时联系博主。当然如果你觉得本文对你有帮助,可以打赏博主,也可以点赞以资鼓励。不管是物资奖励还是精神支持,都是对博主分享精神的肯定,博主一定继续努力。

Javascript 相关文章推荐
js通过地址栏给action传值(中文乱码全是问号)
May 02 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
Apr 22 Javascript
我的Node.js学习之路(一)
Jul 06 Javascript
javascript使用正则获取url上的某个参数
Sep 04 Javascript
如何改进javascript代码的性能
Apr 02 Javascript
jQuery给div,Span, a ,button, radio 赋值与取值
Jun 24 Javascript
vue.js学习笔记之绑定style样式和class列表
Oct 31 Javascript
JS实现弹出下载对话框及常见文件类型的下载
Jul 13 Javascript
微信小程序实现留言功能
Oct 31 Javascript
微信小程序页面间跳转传参方式总结
Jun 13 Javascript
Typescript 中的 interface 和 type 到底有什么区别详解
Jun 18 Javascript
vue项目接口域名动态获取操作
Aug 13 Javascript
Bootstrap基本布局实现方法详解
Nov 25 #Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
Nov 25 #Javascript
Bootstrap栅格系统学习笔记
Nov 25 #Javascript
JS公共小方法之判断对象是否为domElement的实例
Nov 25 #Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
Nov 25 #Javascript
javaScript语法总结
Nov 25 #Javascript
JS实现“隐藏与显示”功能(多种方法)
Nov 24 #Javascript
You might like
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
php使用反射插入对象示例分享
2014/03/11 PHP
Javascript 函数对象的多重身份
2009/06/28 Javascript
异步动态加载js与css文件的js代码
2013/09/15 Javascript
iframe里的页面禁止右键事件的方法
2014/06/10 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
jQuery控制TR显示隐藏的三种常用方法
2014/08/21 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
jQuery选择器用法实例详解
2015/12/17 Javascript
浅谈js函数的多种定义方法与区别
2016/11/29 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
2017/10/31 Javascript
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
vue-cli3使用 DllPlugin 实现预编译提升构建速度
2019/04/24 Javascript
Python实现身份证号码解析
2015/09/01 Python
详解python时间模块中的datetime模块
2016/01/13 Python
Python基础语法(Python基础知识点)
2016/02/28 Python
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
2019/05/27 Python
pycharm配置当鼠标悬停时快速提示方法参数
2019/07/31 Python
python用类实现文章敏感词的过滤方法示例
2019/10/27 Python
Python中私有属性的定义方式
2020/03/05 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
Python如何telnet到网络设备
2021/02/18 Python
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
个人作风剖析材料
2014/02/02 职场文书
入职担保书怎么写
2014/05/12 职场文书
python中的plt.cm.Paired用法说明
2021/05/31 Python
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python