jquery.fileupload-validate.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*
  2. * jQuery File Upload Validation Plugin 1.1
  3. * https://github.com/blueimp/jQuery-File-Upload
  4. *
  5. * Copyright 2013, Sebastian Tschan
  6. * https://blueimp.net
  7. *
  8. * Licensed under the MIT license:
  9. * http://www.opensource.org/licenses/MIT
  10. */
  11. /*jslint nomen: true, unparam: true, regexp: true */
  12. /*global define, window */
  13. (function (factory) {
  14. 'use strict';
  15. if (typeof define === 'function' && define.amd) {
  16. // Register as an anonymous AMD module:
  17. define([
  18. 'jquery',
  19. './jquery.fileupload-process'
  20. ], factory);
  21. } else {
  22. // Browser globals:
  23. factory(
  24. window.jQuery
  25. );
  26. }
  27. }(function ($) {
  28. 'use strict';
  29. // Append to the default processQueue:
  30. $.blueimp.fileupload.prototype.options.processQueue.push(
  31. {
  32. action: 'validate',
  33. // Always trigger this action,
  34. // even if the previous action was rejected:
  35. always: true,
  36. // Options taken from the global options map:
  37. acceptFileTypes: '@',
  38. maxFileSize: '@',
  39. minFileSize: '@',
  40. maxNumberOfFiles: '@',
  41. disabled: '@disableValidation'
  42. }
  43. );
  44. // The File Upload Validation plugin extends the fileupload widget
  45. // with file validation functionality:
  46. $.widget('blueimp.fileupload', $.blueimp.fileupload, {
  47. options: {
  48. /*
  49. // The regular expression for allowed file types, matches
  50. // against either file type or file name:
  51. acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
  52. // The maximum allowed file size in bytes:
  53. maxFileSize: 10000000, // 10 MB
  54. // The minimum allowed file size in bytes:
  55. minFileSize: undefined, // No minimal file size
  56. // The limit of files to be uploaded:
  57. maxNumberOfFiles: 10,
  58. */
  59. // Function returning the current number of files,
  60. // has to be overriden for maxNumberOfFiles validation:
  61. getNumberOfFiles: $.noop,
  62. // Error and info messages:
  63. messages: {
  64. maxNumberOfFiles: 'Maximum number of files exceeded',
  65. acceptFileTypes: 'File type not allowed',
  66. maxFileSize: 'File is too large',
  67. minFileSize: 'File is too small',
  68. alreadyAdded: 'File already added'
  69. }
  70. },
  71. processActions: {
  72. validate: function (data, options) {
  73. if (options.disabled) {
  74. return data;
  75. }
  76. var dfd = $.Deferred(),
  77. settings = this.options,
  78. file = data.files[data.index],
  79. numberOfFiles = settings.getNumberOfFiles();
  80. if (numberOfFiles && $.type(options.maxNumberOfFiles) === 'number' &&
  81. numberOfFiles + data.files.length > options.maxNumberOfFiles) {
  82. file.error = settings.i18n('maxNumberOfFiles');
  83. } else if (options.acceptFileTypes &&
  84. !(options.acceptFileTypes.test(file.type) ||
  85. options.acceptFileTypes.test(file.name))) {
  86. file.error = settings.i18n('acceptFileTypes');
  87. } else if (options.maxFileSize && file.size > options.maxFileSize) {
  88. file.error = settings.i18n('maxFileSize');
  89. } else if ($.type(file.size) === 'number' &&
  90. file.size < options.minFileSize) {
  91. file.error = settings.i18n('minFileSize');
  92. } else if (this._fileAlreadyAdded(file)) {
  93. //@filkor HTML5Upload
  94. file.error = settings.i18n('alreadyAdded');
  95. } else {
  96. delete file.error;
  97. }
  98. if (file.error || data.files.error) {
  99. data.files.error = true;
  100. dfd.rejectWith(this, [data]);
  101. } else {
  102. dfd.resolveWith(this, [data]);
  103. }
  104. return dfd.promise();
  105. }
  106. },
  107. _fileAlreadyAdded: function(file) {
  108. var names = $("#fileupload .filename"),
  109. exists = false;
  110. names.each(function () {
  111. if ($(this).html() == file.name) {
  112. exists = true;
  113. //exit from each
  114. return false;
  115. }
  116. });
  117. return exists;
  118. }
  119. });
  120. }));