bootstrap fileinput实现限制图片上传数量及如何控制分批多次上传
废话没有,直奔主题
问题点:
fileinput提供了一个maxFileCount用于限制图片上传的数量,设置maxFileCount为1时,一次性选择超过一张会有如下提示:
当选择一张,不点上传,再次选择一张时,会这样提示:
但坑爹的是,当选择一张图片后点上传,然后再选择一张再次点上传就可以完美的绕过这个限制,此时maxFileCount就失去了应有的效果
解决方案:
解决思路很简单,当用户选择文件数超过指定数量时直接禁用选择按钮,就是给选择按钮加个disabled属性。
fileinput提供了一系列事件钩子,可以用来解决这个问题,之所以写这篇文章,就是因为这些事件钩子在网上都找不全,导致不少人想出各种歪招来解决,下面是废话,不想看就直接看代码
为了解决这个问题,本人曾经翻遍源码,把所有的事件钩子和配置项都整理了出来,限于时间关系没有深究具体用法,只在碰到问题时再去研究,以问题为导向能大大提高效率
废话不多说,上代码
$("#imgUpload").fileinput({
language: 'zh', //设置语言,
uploadUrl: "/upload/uploadimg/",
showCaption: false,
browseClass: "btn blue",
removeClass: "btn red",
allowedFileExtensions: ['jpg', 'png', 'gif'],
overwriteInitial: false,
maxFileSize: 70000,
maxFileCount: 0, // 这里设为0,由于存在bug,这个属性相当于没什么用了,判断是否超限统一用事件钩子来执行
uploadClass: "btn green",
removeClass: "btn red",
uploadAsync: true,
browseLabel: '选择',
dropZoneEnabled: false,
previewSettings: {
image: {width: "auto", height: "100px"}
},
layoutTemplates: {
actionUpload: ""
},
/* minImageWidth: 1205,
minImageHeight: 405,
maxImageWidth: 1205,
maxImageHeight: 405,*/
// maxFileSize: 100,
msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}!",
uploadExtraData: {
prefix: 'gg_img'
},
initialPreview: {$info.imgs|default='[]'},
initialPreviewAsData: true,
initialPreviewFileType: 'image',
initialPreviewConfig: {$info.previewconfig|default='[]'},
})
.on('filebatchselected', function (evt, file) {
// 选择图片后执行,用于判断选择的图片是否超出限制,超出限制就禁用选择按钮
// 比如只允许上传4张,我分两次上传,第一次上传两张,第二次上传3张,此时手动禁用选择按钮
if($uploadAdvBox.find('.file-preview-frame').length > $uploadLimit.val()) {
$('#imgUpload').attr('disabled', 'disabled')
$('#imgUpload').closest('div.btn-file').addClass('btn-disabled');
}
})
.on('filebatchuploadcomplete', function (evt, file) {
// 只会调用一次,所有图片都上传成功调用,这是为了弥补上传成功后部分DOM结构重新渲染,导致filebatchselected钩子中执行的操作失效
if($uploadAdvBox.find('.file-preview-frame').length > $uploadLimit.val()) {
$('#imgUpload').attr('disabled', 'disabled')
$('#imgUpload').closest('div.btn-file').addClass('btn-disabled');
}
})
.on('fileuploaded', function (event, data, previewId, index) {
// 上传成功几次就调用几次,把后端返回的地址附加到DOM结构上,为以后得操作做准备
if (data.response.status == 1) {
$uploadAdvBox.find('#'+previewId).attr('data-url', data.response.data.name);
} else {
alert(data.response.info);
}
})
.on('fileclear', function (evt, file) {
// 点击右上角叉叉执行
$('#imgUpload').removeAttr('disabled')
$('#imgUpload').closest('div.btn-file').removeClass('btn-disabled')
$uploadAdvBox.find('.fileinput-upload-button').removeAttr('disabled')
})
.on("filesuccessremove",function(event, uploadedId, index){
// 仅对上传成功的图片有效,未上传的图片不执行这里
// 延迟一秒后删除,否则不准确
setTimeout(function () {
if($uploadAdvBox.find('.file-preview-frame').length < $uploadLimit.val()) {
$('#imgUpload').removeAttr('disabled')
$('#imgUpload').closest('div.btn-file').removeClass('btn-disabled')
}
}, 1000)
})
.on('fileremoved', function () {
// 该事件钩子针对只选择不上传的情况
if($uploadAdvBox.find('.file-preview-frame').length <= $uploadLimit.val()) {
$('#imgUpload').removeAttr('disabled')
$('#imgUpload').closest('div.btn-file').removeClass('btn-disabled')
$uploadAdvBox.find('.fileinput-upload-button').removeAttr('disabled')
}
})
这里要特别注意的是,这些事件钩子有执行时间线,这个时间线也是本次研究出来的,已经作为注释写上了
下面是DOM结构,js代码中存在一些变量,大家对照着DOM结构一眼就能明白是什么意思了
<div id="upload_adv_box">
<input id="imgUpload" type="file" multiple name="img_upload" value="上传"/>
</div>
最后
个人的力量是有限的,关于fileinput更多配置项,大家可以看过的上一篇文章
当然很多参数我也不知道怎么用,如果大家找到其用途,麻烦留言告知,不胜感激,传送门
bootstrap fileinput实现限制图片上传数量及如何控制分批多次上传的更多相关文章
- Spring Boot+BootStrap fileInput 多图片上传
一.依赖文件 <link rel="stylesheet" type="text/css" th:href="@{/js/bootstrap/c ...
- JS组件系列——Bootstrap文件上传组件:bootstrap fileinput
前言:之前的三篇介绍了下bootstrap table的一些常见用法,发现博主对这种扁平化的风格有点着迷了.前两天做一个excel导入的功能,前端使用原始的input type='file'这种标签, ...
- BootStrap fileinput.js文件上传组件实例代码
1.首先我们下载好fileinput插件引入插件 ? 1 2 3 <span style="font-size:14px;"><link type="t ...
- JS文件上传神器bootstrap fileinput详解
Bootstrap FileInput插件功能如此强大,完全没有理由不去使用,但是国内很少能找到本插件完整的使用方法,于是本人去其官网翻译了一下英文说明文档放在这里供英文不好的同学勉强查阅.另外附上一 ...
- Bootstrap FileInput 上传 中文 API 整理
Bootstrap FileInput 上传 中文 API 整理 上传插件有很多 但是公司用的就是 Bootstrap FileInput 自己就看了看 会用就行 自己都不知道每个值是干嘛用的就问 ...
- bootstrap fileinput上传文件
参考博客:https://blog.csdn.net/linhaiyun_ytdx/article/details/76215974 https://www.cnblogs.com/parker-y ...
- MVC4中基于bootstrap和HTML5的图片上传Jquery自定义控件
场景:mvc4中上传图片,批量上传,上传前浏览,操作.图片进度条. 解决:自定义jquery控件 没有解决:非图片上传时,会有浏览样式的问题; 解决方案; 1.样式 – bootstrap 的css和 ...
- 关于Bootstrap fileinput 上传新文件,移除时触发服务器同步删除的配置
在Bootstrap fileinput中移除预览文件时可以通过配置initialPreviewConfig: [ { url:'deletefile',key:fileid } ] 来同步删除服务器 ...
- Bootstrap fileinput.js,最好用的文件上传组件
本篇介绍如何使用bootstrap fileinput.js(最好用的文件上传组件)来进行图片的展示,上传,包括springMVC后端文件保存. 一.demo 二.插件引入 <link ty ...
随机推荐
- C# 序列化与反序列化之DataContract与xml对子类进行序列化的解决方案
C# 序列化与反序列化之DataContract与xml对子类进行序列化的解决方案 1.DataContract继承对子类进行序列化的解决方案 第一种是在 [DataContract, KnownTy ...
- Nginx+keepalived实现负载均衡高可用配置
1. 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务,影响严重. 为了屏蔽负载均衡服务 ...
- Dubbo的集群容错与负载均衡策略及自定义(一致性哈希路由的缺点及自定义)
Dubbo的集群容错策略 正常情况下,当我们进行系统设计时候,不仅要考虑正常逻辑下代码该如何走,还要考虑异常情况下代码逻辑应该怎么走.当服务消费方调用服务提供方的服务出现错误时候,Dubbo提供了多种 ...
- Mac下iTerm2使用
之前一直使用 Mac OS 自带的终端,用起来虽然有些不太方便,但总体来说还是可以接受的,是有想换个终端的想法,然后今天偶然看到一个终端利器 iTerm2,发现真的很强大,也非常的好用,按照网上配置了 ...
- 查看apache httpd server中加载了哪些模块
说明: 有的时候,需要查看当前apache中都加载了哪些模块,通过以下命令进行查看 [root@hadoop1 httpd-]# bin/apachectl -t -D DUMP_MODULES Lo ...
- fragment原来的页面切换被重新实例化,无法继续保持上一次的内容。只让它执行一次
最好的方法是: 定义类.静态变量的方式 保存数据,从这里取. 用网上其他人的方法,fragment切换速度太快会报错 child view 没有从parent view 中移除: 只执行一次,定义一个 ...
- VS找不到头文件但是系统路径已经设置
有时候会出现打不开Include文件的问题,但是在系统包含include路径中已经设置,编译也没问题,就是一直有错误提示 这时候可以尝试在项目上点击右键,选择“下载项目”,然后再选择加载 如果还是不行 ...
- linux下 tab键失效 -bash: !ref: 为绑定变量
报错现象: Linux环境下,按Tab键进行补全时出现上图情况. [root@worker2 cjj]# vim /et-bash: !ref: 为绑定变量 -bash: !ref: 为绑定变量 -b ...
- 【翻译】Flink Table Api & SQL — SQL客户端Beta 版
本文翻译自官网:SQL Client Beta https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/sqlCl ...
- 工控随笔_25_西门子TIA 博图V14.SP1安装报错,授权错误
前面有一篇文章说过西门子的软件安装的时候太麻烦,很容易出现错误. 但是有些错误在安装的时候却没有关系,例如下面的错误. 如上图所示,安装已经到最后一步,总结前面的修改系统组态已经打勾(✔) ,而且提示 ...