废话没有,直奔主题

问题点:

  fileinput提供了一个maxFileCount用于限制图片上传的数量,设置maxFileCount为1时,一次性选择超过一张会有如下提示:

  

  当选择一张,不点上传,再次选择一张时,会这样提示:

  

  但坑爹的是,当选择一张图片后点上传,然后再选择一张再次点上传就可以完美的绕过这个限制,此时maxFileCount就失去了应有的效果

解决方案:

  解决思路很简单,当用户选择文件数超过指定数量时直接禁用选择按钮,就是给选择按钮加个disabled属性。

  fileinput提供了一系列事件钩子,可以用来解决这个问题,之所以写这篇文章,就是因为这些事件钩子在网上都找不全,导致不少人想出各种歪招来解决,下面是废话,不想看就直接看代码

  为了解决这个问题,本人曾经翻遍源码,把所有的事件钩子和配置项都整理了出来,限于时间关系没有深究具体用法,只在碰到问题时再去研究,以问题为导向能大大提高效率  

  废话不多说,上代码

  1. $("#imgUpload").fileinput({
  2. language: 'zh', //设置语言,
  3. uploadUrl: "/upload/uploadimg/",
  4. showCaption: false,
  5. browseClass: "btn blue",
  6. removeClass: "btn red",
  7. allowedFileExtensions: ['jpg', 'png', 'gif'],
  8. overwriteInitial: false,
  9. maxFileSize: 70000,
  10. maxFileCount: 0, // 这里设为0,由于存在bug,这个属性相当于没什么用了,判断是否超限统一用事件钩子来执行
  11. uploadClass: "btn green",
  12. removeClass: "btn red",
  13. uploadAsync: true,
  14. browseLabel: '选择',
  15. dropZoneEnabled: false,
  16. previewSettings: {
  17. image: {width: "auto", height: "100px"}
  18. },
  19. layoutTemplates: {
  20. actionUpload: ""
  21. },
  22. /* minImageWidth: 1205,
  23. minImageHeight: 405,
  24. maxImageWidth: 1205,
  25. maxImageHeight: 405,*/
  26. // maxFileSize: 100,
  27. msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}!",
  28. uploadExtraData: {
  29. prefix: 'gg_img'
  30. },
  31. initialPreview: {$info.imgs|default='[]'},
  32. initialPreviewAsData: true,
  33. initialPreviewFileType: 'image',
  34. initialPreviewConfig: {$info.previewconfig|default='[]'},
  35. })
  36. .on('filebatchselected', function (evt, file) {
  37. // 选择图片后执行,用于判断选择的图片是否超出限制,超出限制就禁用选择按钮
  38. // 比如只允许上传4张,我分两次上传,第一次上传两张,第二次上传3张,此时手动禁用选择按钮
  39. if($uploadAdvBox.find('.file-preview-frame').length > $uploadLimit.val()) {
  40. $('#imgUpload').attr('disabled', 'disabled')
  41. $('#imgUpload').closest('div.btn-file').addClass('btn-disabled');
  42. }
  43. })
  44. .on('filebatchuploadcomplete', function (evt, file) {
  45. // 只会调用一次,所有图片都上传成功调用,这是为了弥补上传成功后部分DOM结构重新渲染,导致filebatchselected钩子中执行的操作失效
  46. if($uploadAdvBox.find('.file-preview-frame').length > $uploadLimit.val()) {
  47. $('#imgUpload').attr('disabled', 'disabled')
  48. $('#imgUpload').closest('div.btn-file').addClass('btn-disabled');
  49. }
  50. })
  51. .on('fileuploaded', function (event, data, previewId, index) {
  52. // 上传成功几次就调用几次,把后端返回的地址附加到DOM结构上,为以后得操作做准备
  53. if (data.response.status == 1) {
  54. $uploadAdvBox.find('#'+previewId).attr('data-url', data.response.data.name);
  55. } else {
  56. alert(data.response.info);
  57. }
  58. })
  59. .on('fileclear', function (evt, file) {
  60. // 点击右上角叉叉执行
  61. $('#imgUpload').removeAttr('disabled')
  62. $('#imgUpload').closest('div.btn-file').removeClass('btn-disabled')
  63. $uploadAdvBox.find('.fileinput-upload-button').removeAttr('disabled')
  64. })
  65. .on("filesuccessremove",function(event, uploadedId, index){
  66. // 仅对上传成功的图片有效,未上传的图片不执行这里
  67. // 延迟一秒后删除,否则不准确
  68. setTimeout(function () {
  69. if($uploadAdvBox.find('.file-preview-frame').length < $uploadLimit.val()) {
  70. $('#imgUpload').removeAttr('disabled')
  71. $('#imgUpload').closest('div.btn-file').removeClass('btn-disabled')
  72. }
  73. }, 1000)
  74. })
  75. .on('fileremoved', function () {
  76. // 该事件钩子针对只选择不上传的情况
  77. if($uploadAdvBox.find('.file-preview-frame').length <= $uploadLimit.val()) {
  78. $('#imgUpload').removeAttr('disabled')
  79. $('#imgUpload').closest('div.btn-file').removeClass('btn-disabled')
  80. $uploadAdvBox.find('.fileinput-upload-button').removeAttr('disabled')
  81. }
  82. })

这里要特别注意的是,这些事件钩子有执行时间线,这个时间线也是本次研究出来的,已经作为注释写上了

下面是DOM结构,js代码中存在一些变量,大家对照着DOM结构一眼就能明白是什么意思了

  1. <div id="upload_adv_box">
  2. <input id="imgUpload" type="file" multiple name="img_upload" value="上传"/>
  3. </div>

  

最后

  个人的力量是有限的,关于fileinput更多配置项,大家可以看过的上一篇文章

  当然很多参数我也不知道怎么用,如果大家找到其用途,麻烦留言告知,不胜感激,传送门

bootstrap fileinput实现限制图片上传数量及如何控制分批多次上传的更多相关文章

  1. Spring Boot+BootStrap fileInput 多图片上传

    一.依赖文件 <link rel="stylesheet" type="text/css" th:href="@{/js/bootstrap/c ...

  2. JS组件系列——Bootstrap文件上传组件:bootstrap fileinput

    前言:之前的三篇介绍了下bootstrap table的一些常见用法,发现博主对这种扁平化的风格有点着迷了.前两天做一个excel导入的功能,前端使用原始的input type='file'这种标签, ...

  3. BootStrap fileinput.js文件上传组件实例代码

    1.首先我们下载好fileinput插件引入插件 ? 1 2 3 <span style="font-size:14px;"><link type="t ...

  4. JS文件上传神器bootstrap fileinput详解

    Bootstrap FileInput插件功能如此强大,完全没有理由不去使用,但是国内很少能找到本插件完整的使用方法,于是本人去其官网翻译了一下英文说明文档放在这里供英文不好的同学勉强查阅.另外附上一 ...

  5. Bootstrap FileInput 上传 中文 API 整理

    Bootstrap FileInput 上传  中文 API 整理 上传插件有很多 但是公司用的就是 Bootstrap FileInput 自己就看了看  会用就行 自己都不知道每个值是干嘛用的就问 ...

  6. bootstrap fileinput上传文件

    参考博客:https://blog.csdn.net/linhaiyun_ytdx/article/details/76215974  https://www.cnblogs.com/parker-y ...

  7. MVC4中基于bootstrap和HTML5的图片上传Jquery自定义控件

    场景:mvc4中上传图片,批量上传,上传前浏览,操作.图片进度条. 解决:自定义jquery控件 没有解决:非图片上传时,会有浏览样式的问题; 解决方案; 1.样式 – bootstrap 的css和 ...

  8. 关于Bootstrap fileinput 上传新文件,移除时触发服务器同步删除的配置

    在Bootstrap fileinput中移除预览文件时可以通过配置initialPreviewConfig: [ { url:'deletefile',key:fileid } ] 来同步删除服务器 ...

  9. Bootstrap fileinput.js,最好用的文件上传组件

    本篇介绍如何使用bootstrap fileinput.js(最好用的文件上传组件)来进行图片的展示,上传,包括springMVC后端文件保存. 一.demo   二.插件引入 <link ty ...

随机推荐

  1. gcc 编译两个so其中soA依赖soB

    有两个so,其中soB中调用soA: 那么我们打包soB的时候连接soA: 在打包test程序的时候连接soB,此时soB会自动查找依赖的soA: 如下测试 在编译之前指定环境变量:export LD ...

  2. Spring-boot +Shiro 导致事务无效

    今天在开发过程中,遇到一个情况,就是事务事务,同项目的别的service都在事务中,可以就是有一个事务失效. 排除了各种情况 1.检查数据库的引擎是否是innoDB 2.方法是否为public 3.这 ...

  3. vue---引入外部样式

    在用 vue-cli 进行项目开发的时候,经常会遇到要引入外部的样式,那该怎么做的呢? 示例:使用 import 引入 scss import variables from '@/assets/sty ...

  4. 禁用 Ubuntu 18.04 Files 的 Type Ahead search 功能

    . . . . . Ubuntu 的文件浏览器(Files)提供了一个搜索的功能,叫做“Type Ahead search”.即我们在文件浏览器中输入某个文件的名字时,Files 并不是将焦点定位在某 ...

  5. Linux下安装.NET Core

    环境 { "操作系统":"CentOS 7.5 64位", "CPU":"1核", "内存":&qu ...

  6. dotnet core swagger filter 隐藏接口和显示枚举描述

    dotnet core 2.2开发项目中,常会使用Swagger UI来生成在线Api文档. 某些接口不想放到Swagger中可以这样写Filter: /// <summary> /// ...

  7. php异常处理小总结

    2019年8月23日10:56:31 php很多开发不习惯使用异常处理,因为web开发,重在于快速开发,易用性,高性能,不强调程序健壮性 php的异常使用其实不是太完善,易用性也差点,当然这个对比其他 ...

  8. nginx使用与配置入门指南

    这是一篇关于nginx使用与配置的入门指南,但不包括nginx的编译与安装.我假定你知晓如何安装nginx.对大多数Linux系统来说,nginx都已经存在于它们的软件包里,直接使用系统提供的软件管理 ...

  9. jiaba

  10. kafka-manager 创建 topic【转】

    1,add cluster 添加cluster 添加cluster 选择一下kafka的版本 2,创建topic 添加topic 3,查看topic 查看topic