s3_cors_fileupload 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -2
- data/Gemfile +1 -1
- data/Gemfile.lock +19 -19
- data/README.md +13 -1
- data/lib/generators/s3_cors_fileupload/install/templates/s3_uploads.js +1 -2
- data/lib/generators/s3_cors_fileupload/install/templates/source_file.rb +1 -1
- data/lib/generators/s3_cors_fileupload/install/templates/views/erb/_template_download.html.erb +19 -16
- data/lib/generators/s3_cors_fileupload/install/templates/views/erb/_template_upload.html.erb +31 -26
- data/lib/generators/s3_cors_fileupload/install/templates/views/erb/_template_uploaded.html.erb +18 -13
- data/lib/generators/s3_cors_fileupload/install/templates/views/erb/index.html.erb +1 -1
- data/lib/generators/s3_cors_fileupload/install/templates/views/haml/_template_download.html.haml +16 -21
- data/lib/generators/s3_cors_fileupload/install/templates/views/haml/_template_upload.html.haml +15 -18
- data/lib/generators/s3_cors_fileupload/install/templates/views/haml/_template_uploaded.html.haml +12 -13
- data/lib/generators/s3_cors_fileupload/install/templates/views/haml/index.html.haml +1 -1
- data/lib/s3_cors_fileupload/rails/form_helper.rb +16 -14
- data/lib/s3_cors_fileupload/version.rb +3 -3
- data/vendor/assets/javascripts/s3_cors_fileupload/index.js +4 -1
- data/vendor/assets/javascripts/s3_cors_fileupload/jquery.fileupload-image.js +213 -0
- data/vendor/assets/javascripts/s3_cors_fileupload/jquery.fileupload-process.js +164 -0
- data/vendor/assets/javascripts/s3_cors_fileupload/jquery.fileupload-ui.js +62 -228
- data/vendor/assets/javascripts/s3_cors_fileupload/jquery.fileupload-validate.js +116 -0
- data/vendor/assets/javascripts/s3_cors_fileupload/jquery.fileupload.js +212 -84
- data/vendor/assets/javascripts/s3_cors_fileupload/jquery.iframe-transport.js +24 -4
- data/vendor/assets/javascripts/s3_cors_fileupload/vendor/jquery.ui.widget.js +1 -1
- data/vendor/assets/javascripts/s3_cors_fileupload/vendor/load-image.js +138 -172
- data/vendor/assets/javascripts/s3_cors_fileupload/vendor/tmpl.js +3 -4
- data/vendor/assets/stylesheets/jquery.fileupload-ui.css.erb +12 -28
- metadata +5 -2
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* jQuery File Upload User Interface Plugin
|
2
|
+
* jQuery File Upload User Interface Plugin 8.5.0
|
3
3
|
* https://github.com/blueimp/jQuery-File-Upload
|
4
4
|
*
|
5
5
|
* Copyright 2010, Sebastian Tschan
|
@@ -19,20 +19,27 @@
|
|
19
19
|
define([
|
20
20
|
'jquery',
|
21
21
|
'tmpl',
|
22
|
-
'
|
23
|
-
'./jquery.fileupload-
|
22
|
+
'./jquery.fileupload-image',
|
23
|
+
'./jquery.fileupload-audio',
|
24
|
+
'./jquery.fileupload-video',
|
25
|
+
'./jquery.fileupload-validate'
|
24
26
|
], factory);
|
25
27
|
} else {
|
26
28
|
// Browser globals:
|
27
29
|
factory(
|
28
30
|
window.jQuery,
|
29
|
-
window.tmpl
|
30
|
-
window.loadImage
|
31
|
+
window.tmpl
|
31
32
|
);
|
32
33
|
}
|
33
34
|
}(function ($, tmpl, loadImage) {
|
34
35
|
'use strict';
|
35
36
|
|
37
|
+
$.blueimp.fileupload.prototype._specialOptions.push(
|
38
|
+
'filesContainer',
|
39
|
+
'uploadTemplateId',
|
40
|
+
'downloadTemplateId'
|
41
|
+
);
|
42
|
+
|
36
43
|
// The UI version extends the file upload widget
|
37
44
|
// and adds complete user interface interaction:
|
38
45
|
$.widget('blueimp.fileupload', $.blueimp.fileupload, {
|
@@ -42,29 +49,6 @@
|
|
42
49
|
// as the user clicks on the start buttons. To enable automatic
|
43
50
|
// uploads, set the following option to true:
|
44
51
|
autoUpload: false,
|
45
|
-
// The following option limits the number of files that are
|
46
|
-
// allowed to be uploaded using this widget:
|
47
|
-
maxNumberOfFiles: undefined,
|
48
|
-
// The maximum allowed file size:
|
49
|
-
maxFileSize: undefined,
|
50
|
-
// The minimum allowed file size:
|
51
|
-
minFileSize: undefined,
|
52
|
-
// The regular expression for allowed file types, matches
|
53
|
-
// against either file type or file name:
|
54
|
-
acceptFileTypes: /.+$/i,
|
55
|
-
// The regular expression to define for which files a preview
|
56
|
-
// image is shown, matched against the file type:
|
57
|
-
previewSourceFileTypes: /^image\/(gif|jpeg|png)$/,
|
58
|
-
// The maximum file size of images that are to be displayed as preview:
|
59
|
-
previewSourceMaxFileSize: 5000000, // 5MB
|
60
|
-
// The maximum width of the preview images:
|
61
|
-
previewMaxWidth: 80,
|
62
|
-
// The maximum height of the preview images:
|
63
|
-
previewMaxHeight: 80,
|
64
|
-
// By default, preview images are displayed as canvas elements
|
65
|
-
// if supported by the browser. Set the following option to false
|
66
|
-
// to always display preview images as img elements:
|
67
|
-
previewAsCanvas: true,
|
68
52
|
// The ID of the upload template:
|
69
53
|
uploadTemplateId: 'template-upload',
|
70
54
|
// The ID of the download template:
|
@@ -79,29 +63,43 @@
|
|
79
63
|
// option of the $.ajax upload requests:
|
80
64
|
dataType: 'json',
|
81
65
|
|
66
|
+
// Function returning the current number of files,
|
67
|
+
// used by the maxNumberOfFiles validation:
|
68
|
+
getNumberOfFiles: function () {
|
69
|
+
return this.filesContainer.children().length;
|
70
|
+
},
|
71
|
+
|
72
|
+
// Callback to retrieve the list of files from the server response:
|
73
|
+
getFilesFromResponse: function (data) {
|
74
|
+
if (data.result && $.isArray(data.result.files)) {
|
75
|
+
return data.result.files;
|
76
|
+
}
|
77
|
+
return [];
|
78
|
+
},
|
79
|
+
|
82
80
|
// The add callback is invoked as soon as files are added to the fileupload
|
83
81
|
// widget (via file input selection, drag & drop or add API call).
|
84
82
|
// See the basic file upload widget for more information:
|
85
83
|
add: function (e, data) {
|
86
|
-
var
|
87
|
-
|
84
|
+
var $this = $(this),
|
85
|
+
that = $this.data('blueimp-fileupload') ||
|
86
|
+
$this.data('fileupload'),
|
88
87
|
options = that.options,
|
89
88
|
files = data.files;
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
data.files.valid = data.isValidated = that._validate(files);
|
89
|
+
data.process(function () {
|
90
|
+
return $this.fileupload('process', data);
|
91
|
+
}).always(function () {
|
94
92
|
data.context = that._renderUpload(files).data('data', data);
|
93
|
+
that._renderPreviews(data);
|
95
94
|
options.filesContainer[
|
96
95
|
options.prependFiles ? 'prepend' : 'append'
|
97
96
|
](data.context);
|
98
|
-
that._renderPreviews(data);
|
99
97
|
that._forceReflow(data.context);
|
100
98
|
that._transition(data.context).done(
|
101
99
|
function () {
|
102
100
|
if ((that._trigger('added', e, data) !== false) &&
|
103
101
|
(options.autoUpload || data.autoUpload) &&
|
104
|
-
data.autoUpload !== false && data.
|
102
|
+
data.autoUpload !== false && !data.files.error) {
|
105
103
|
data.submit();
|
106
104
|
}
|
107
105
|
}
|
@@ -112,15 +110,6 @@
|
|
112
110
|
send: function (e, data) {
|
113
111
|
var that = $(this).data('blueimp-fileupload') ||
|
114
112
|
$(this).data('fileupload');
|
115
|
-
if (!data.isValidated) {
|
116
|
-
if (!data.maxNumberOfFilesAdjusted) {
|
117
|
-
that._adjustMaxNumberOfFiles(-data.files.length);
|
118
|
-
data.maxNumberOfFilesAdjusted = true;
|
119
|
-
}
|
120
|
-
if (!that._validate(data.files)) {
|
121
|
-
return false;
|
122
|
-
}
|
123
|
-
}
|
124
113
|
if (data.context && data.dataType &&
|
125
114
|
data.dataType.substr(0, 6) === 'iframe') {
|
126
115
|
// Iframe Transport does not support progress events.
|
@@ -142,7 +131,9 @@
|
|
142
131
|
done: function (e, data) {
|
143
132
|
var that = $(this).data('blueimp-fileupload') ||
|
144
133
|
$(this).data('fileupload'),
|
145
|
-
|
134
|
+
getFilesFromResponse = data.getFilesFromResponse ||
|
135
|
+
that.options.getFilesFromResponse,
|
136
|
+
files = getFilesFromResponse(data),
|
146
137
|
template,
|
147
138
|
deferred;
|
148
139
|
if (data.context) {
|
@@ -150,9 +141,6 @@
|
|
150
141
|
var file = files[index] ||
|
151
142
|
{error: 'Empty file upload result'},
|
152
143
|
deferred = that._addFinishedDeferreds();
|
153
|
-
if (file.error) {
|
154
|
-
that._adjustMaxNumberOfFiles(1);
|
155
|
-
}
|
156
144
|
that._transition($(this)).done(
|
157
145
|
function () {
|
158
146
|
var node = $(this);
|
@@ -171,17 +159,6 @@
|
|
171
159
|
);
|
172
160
|
});
|
173
161
|
} else {
|
174
|
-
if (files.length) {
|
175
|
-
$.each(files, function (index, file) {
|
176
|
-
if (data.maxNumberOfFilesAdjusted && file.error) {
|
177
|
-
that._adjustMaxNumberOfFiles(1);
|
178
|
-
} else if (!data.maxNumberOfFilesAdjusted &&
|
179
|
-
!file.error) {
|
180
|
-
that._adjustMaxNumberOfFiles(-1);
|
181
|
-
}
|
182
|
-
});
|
183
|
-
data.maxNumberOfFilesAdjusted = true;
|
184
|
-
}
|
185
162
|
template = that._renderDownload(files)
|
186
163
|
.appendTo(that.options.filesContainer);
|
187
164
|
that._forceReflow(template);
|
@@ -202,9 +179,6 @@
|
|
202
179
|
$(this).data('fileupload'),
|
203
180
|
template,
|
204
181
|
deferred;
|
205
|
-
if (data.maxNumberOfFilesAdjusted) {
|
206
|
-
that._adjustMaxNumberOfFiles(data.files.length);
|
207
|
-
}
|
208
182
|
if (data.context) {
|
209
183
|
data.context.each(function (index) {
|
210
184
|
if (data.errorThrown !== 'abort') {
|
@@ -323,22 +297,31 @@
|
|
323
297
|
}
|
324
298
|
);
|
325
299
|
},
|
300
|
+
processstart: function () {
|
301
|
+
$(this).addClass('fileupload-processing');
|
302
|
+
},
|
303
|
+
processstop: function () {
|
304
|
+
$(this).removeClass('fileupload-processing');
|
305
|
+
},
|
326
306
|
// Callback for file deletion:
|
327
307
|
destroy: function (e, data) {
|
328
308
|
if (data.confirmation && !confirm(data.confirmation))
|
329
309
|
return; // abort the deletion if the user rejects the confirmation dialog
|
330
310
|
var that = $(this).data('blueimp-fileupload') ||
|
331
|
-
$(this).data('fileupload')
|
311
|
+
$(this).data('fileupload'),
|
312
|
+
removeNode = function () {
|
313
|
+
that._transition(data.context).done(
|
314
|
+
function () {
|
315
|
+
$(this).remove();
|
316
|
+
that._trigger('destroyed', e, data);
|
317
|
+
}
|
318
|
+
);
|
319
|
+
};
|
332
320
|
if (data.url) {
|
333
|
-
$.ajax(data);
|
334
|
-
|
321
|
+
$.ajax(data).done(removeNode);
|
322
|
+
} else {
|
323
|
+
removeNode();
|
335
324
|
}
|
336
|
-
that._transition(data.context).done(
|
337
|
-
function () {
|
338
|
-
$(this).remove();
|
339
|
-
that._trigger('destroyed', e, data);
|
340
|
-
}
|
341
|
-
);
|
342
325
|
}
|
343
326
|
},
|
344
327
|
|
@@ -358,13 +341,6 @@
|
|
358
341
|
return this._finishedUploads;
|
359
342
|
},
|
360
343
|
|
361
|
-
_getFilesFromResponse: function (data) {
|
362
|
-
if (data.result && $.isArray(data.result.files)) {
|
363
|
-
return data.result.files;
|
364
|
-
}
|
365
|
-
return [];
|
366
|
-
},
|
367
|
-
|
368
344
|
// Link handler, that allows to download files
|
369
345
|
// by drag & drop of the links to the desktop:
|
370
346
|
_enableDragToDesktop: function () {
|
@@ -378,21 +354,10 @@
|
|
378
354
|
'DownloadURL',
|
379
355
|
[type, name, url].join(':')
|
380
356
|
);
|
381
|
-
} catch (
|
357
|
+
} catch (ignore) {}
|
382
358
|
});
|
383
359
|
},
|
384
360
|
|
385
|
-
_adjustMaxNumberOfFiles: function (operand) {
|
386
|
-
if (typeof this.options.maxNumberOfFiles === 'number') {
|
387
|
-
this.options.maxNumberOfFiles += operand;
|
388
|
-
if (this.options.maxNumberOfFiles < 1) {
|
389
|
-
this._disableFileInputButton();
|
390
|
-
} else {
|
391
|
-
this._enableFileInputButton();
|
392
|
-
}
|
393
|
-
}
|
394
|
-
},
|
395
|
-
|
396
361
|
_formatFileSize: function (bytes) {
|
397
362
|
if (typeof bytes !== 'number') {
|
398
363
|
return '';
|
@@ -448,46 +413,6 @@
|
|
448
413
|
this._formatFileSize(data.total);
|
449
414
|
},
|
450
415
|
|
451
|
-
_hasError: function (file) {
|
452
|
-
if (file.error) {
|
453
|
-
return file.error;
|
454
|
-
}
|
455
|
-
// The number of added files is subtracted from
|
456
|
-
// maxNumberOfFiles before validation, so we check if
|
457
|
-
// maxNumberOfFiles is below 0 (instead of below 1):
|
458
|
-
if (this.options.maxNumberOfFiles < 0) {
|
459
|
-
return 'Maximum number of files exceeded';
|
460
|
-
}
|
461
|
-
// Files are accepted if either the file type or the file name
|
462
|
-
// matches against the acceptFileTypes regular expression, as
|
463
|
-
// only browsers with support for the File API report the type:
|
464
|
-
if (!(this.options.acceptFileTypes.test(file.type) ||
|
465
|
-
this.options.acceptFileTypes.test(file.name))) {
|
466
|
-
return 'Filetype not allowed';
|
467
|
-
}
|
468
|
-
if (this.options.maxFileSize &&
|
469
|
-
file.size > this.options.maxFileSize) {
|
470
|
-
return 'File is too big';
|
471
|
-
}
|
472
|
-
if (typeof file.size === 'number' &&
|
473
|
-
file.size < this.options.minFileSize) {
|
474
|
-
return 'File is too small';
|
475
|
-
}
|
476
|
-
return null;
|
477
|
-
},
|
478
|
-
|
479
|
-
_validate: function (files) {
|
480
|
-
var that = this,
|
481
|
-
valid = !!files.length;
|
482
|
-
$.each(files, function (index, file) {
|
483
|
-
file.error = that._hasError(file);
|
484
|
-
if (file.error) {
|
485
|
-
valid = false;
|
486
|
-
}
|
487
|
-
});
|
488
|
-
return valid;
|
489
|
-
},
|
490
|
-
|
491
416
|
_renderTemplate: function (func, files) {
|
492
417
|
if (!func) {
|
493
418
|
return $();
|
@@ -503,63 +428,10 @@
|
|
503
428
|
return $(this.options.templatesContainer).html(result).children();
|
504
429
|
},
|
505
430
|
|
506
|
-
_renderPreview: function (file, node) {
|
507
|
-
var that = this,
|
508
|
-
options = this.options,
|
509
|
-
dfd = $.Deferred();
|
510
|
-
return ((loadImage && loadImage(
|
511
|
-
file,
|
512
|
-
function (img) {
|
513
|
-
node.append(img);
|
514
|
-
that._forceReflow(node);
|
515
|
-
that._transition(node).done(function () {
|
516
|
-
dfd.resolveWith(node);
|
517
|
-
});
|
518
|
-
if (!$.contains(that.document[0].body, node[0])) {
|
519
|
-
// If the element is not part of the DOM,
|
520
|
-
// transition events are not triggered,
|
521
|
-
// so we have to resolve manually:
|
522
|
-
dfd.resolveWith(node);
|
523
|
-
}
|
524
|
-
node.on('remove', function () {
|
525
|
-
// If the element is removed before the
|
526
|
-
// transition finishes, transition events are
|
527
|
-
// not triggered, resolve manually:
|
528
|
-
dfd.resolveWith(node);
|
529
|
-
});
|
530
|
-
},
|
531
|
-
{
|
532
|
-
maxWidth: options.previewMaxWidth,
|
533
|
-
maxHeight: options.previewMaxHeight,
|
534
|
-
canvas: options.previewAsCanvas
|
535
|
-
}
|
536
|
-
)) || dfd.resolveWith(node)) && dfd;
|
537
|
-
},
|
538
|
-
|
539
431
|
_renderPreviews: function (data) {
|
540
|
-
|
541
|
-
|
542
|
-
data.context.find('.preview span').each(function (index, element) {
|
543
|
-
var file = data.files[index];
|
544
|
-
if (options.previewSourceFileTypes.test(file.type) &&
|
545
|
-
($.type(options.previewSourceMaxFileSize) !== 'number' ||
|
546
|
-
file.size < options.previewSourceMaxFileSize)) {
|
547
|
-
that._processingQueue = that._processingQueue.pipe(function () {
|
548
|
-
var dfd = $.Deferred(),
|
549
|
-
ev = $.Event('previewdone', {
|
550
|
-
target: element
|
551
|
-
});
|
552
|
-
that._renderPreview(file, $(element)).done(
|
553
|
-
function () {
|
554
|
-
that._trigger(ev.type, ev, data);
|
555
|
-
dfd.resolveWith(that);
|
556
|
-
}
|
557
|
-
);
|
558
|
-
return dfd.promise();
|
559
|
-
});
|
560
|
-
}
|
432
|
+
data.context.find('.preview').each(function (index, elm) {
|
433
|
+
$(elm).append(data.files[index].preview);
|
561
434
|
});
|
562
|
-
return this._processingQueue;
|
563
435
|
},
|
564
436
|
|
565
437
|
_renderUpload: function (files) {
|
@@ -603,8 +475,7 @@
|
|
603
475
|
var button = $(e.currentTarget);
|
604
476
|
this._trigger('destroy', e, $.extend({
|
605
477
|
context: button.closest('.template-download'),
|
606
|
-
type: 'DELETE'
|
607
|
-
dataType: this.options.dataType
|
478
|
+
type: 'DELETE'
|
608
479
|
}, button.data()));
|
609
480
|
},
|
610
481
|
|
@@ -733,55 +604,18 @@
|
|
733
604
|
}
|
734
605
|
},
|
735
606
|
|
736
|
-
_stringToRegExp: function (str) {
|
737
|
-
var parts = str.split('/'),
|
738
|
-
modifiers = parts.pop();
|
739
|
-
parts.shift();
|
740
|
-
return new RegExp(parts.join('/'), modifiers);
|
741
|
-
},
|
742
|
-
|
743
|
-
_initRegExpOptions: function () {
|
744
|
-
var options = this.options;
|
745
|
-
if ($.type(options.acceptFileTypes) === 'string') {
|
746
|
-
options.acceptFileTypes = this._stringToRegExp(
|
747
|
-
options.acceptFileTypes
|
748
|
-
);
|
749
|
-
}
|
750
|
-
if ($.type(options.previewSourceFileTypes) === 'string') {
|
751
|
-
options.previewSourceFileTypes = this._stringToRegExp(
|
752
|
-
options.previewSourceFileTypes
|
753
|
-
);
|
754
|
-
}
|
755
|
-
},
|
756
|
-
|
757
607
|
_initSpecialOptions: function () {
|
758
608
|
this._super();
|
759
609
|
this._initFilesContainer();
|
760
610
|
this._initTemplates();
|
761
|
-
this._initRegExpOptions();
|
762
|
-
},
|
763
|
-
|
764
|
-
_setOption: function (key, value) {
|
765
|
-
this._super(key, value);
|
766
|
-
if (key === 'maxNumberOfFiles') {
|
767
|
-
this._adjustMaxNumberOfFiles(0);
|
768
|
-
}
|
769
611
|
},
|
770
612
|
|
771
613
|
_create: function () {
|
772
614
|
this._super();
|
773
|
-
this._refreshOptionsList.push(
|
774
|
-
'filesContainer',
|
775
|
-
'uploadTemplateId',
|
776
|
-
'downloadTemplateId'
|
777
|
-
);
|
778
|
-
if (!this._processingQueue) {
|
779
|
-
this._processingQueue = $.Deferred().resolveWith(this).promise();
|
780
|
-
this.process = function () {
|
781
|
-
return this._processingQueue;
|
782
|
-
};
|
783
|
-
}
|
784
615
|
this._resetFinishedDeferreds();
|
616
|
+
if (!$.support.fileInput) {
|
617
|
+
this._disableFileInputButton();
|
618
|
+
}
|
785
619
|
},
|
786
620
|
|
787
621
|
enable: function () {
|
@@ -0,0 +1,116 @@
|
|
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
|
+
|
12
|
+
/*jslint nomen: true, unparam: true, regexp: true */
|
13
|
+
/*global define, window */
|
14
|
+
|
15
|
+
(function (factory) {
|
16
|
+
'use strict';
|
17
|
+
if (typeof define === 'function' && define.amd) {
|
18
|
+
// Register as an anonymous AMD module:
|
19
|
+
define([
|
20
|
+
'jquery',
|
21
|
+
'./jquery.fileupload-process'
|
22
|
+
], factory);
|
23
|
+
} else {
|
24
|
+
// Browser globals:
|
25
|
+
factory(
|
26
|
+
window.jQuery
|
27
|
+
);
|
28
|
+
}
|
29
|
+
}(function ($) {
|
30
|
+
'use strict';
|
31
|
+
|
32
|
+
// Append to the default processQueue:
|
33
|
+
$.blueimp.fileupload.prototype.options.processQueue.push(
|
34
|
+
{
|
35
|
+
action: 'validate',
|
36
|
+
// Always trigger this action,
|
37
|
+
// even if the previous action was rejected:
|
38
|
+
always: true,
|
39
|
+
// Options taken from the global options map:
|
40
|
+
acceptFileTypes: '@',
|
41
|
+
maxFileSize: '@',
|
42
|
+
minFileSize: '@',
|
43
|
+
maxNumberOfFiles: '@',
|
44
|
+
disabled: '@disableValidation'
|
45
|
+
}
|
46
|
+
);
|
47
|
+
|
48
|
+
// The File Upload Validation plugin extends the fileupload widget
|
49
|
+
// with file validation functionality:
|
50
|
+
$.widget('blueimp.fileupload', $.blueimp.fileupload, {
|
51
|
+
|
52
|
+
options: {
|
53
|
+
/*
|
54
|
+
// The regular expression for allowed file types, matches
|
55
|
+
// against either file type or file name:
|
56
|
+
acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
|
57
|
+
// The maximum allowed file size in bytes:
|
58
|
+
maxFileSize: 10000000, // 10 MB
|
59
|
+
// The minimum allowed file size in bytes:
|
60
|
+
minFileSize: undefined, // No minimal file size
|
61
|
+
// The limit of files to be uploaded:
|
62
|
+
maxNumberOfFiles: 10,
|
63
|
+
*/
|
64
|
+
|
65
|
+
// Function returning the current number of files,
|
66
|
+
// has to be overriden for maxNumberOfFiles validation:
|
67
|
+
getNumberOfFiles: $.noop,
|
68
|
+
|
69
|
+
// Error and info messages:
|
70
|
+
messages: {
|
71
|
+
maxNumberOfFiles: 'Maximum number of files exceeded',
|
72
|
+
acceptFileTypes: 'File type not allowed',
|
73
|
+
maxFileSize: 'File is too large',
|
74
|
+
minFileSize: 'File is too small'
|
75
|
+
}
|
76
|
+
},
|
77
|
+
|
78
|
+
processActions: {
|
79
|
+
|
80
|
+
validate: function (data, options) {
|
81
|
+
if (options.disabled) {
|
82
|
+
return data;
|
83
|
+
}
|
84
|
+
var dfd = $.Deferred(),
|
85
|
+
settings = this.options,
|
86
|
+
file = data.files[data.index],
|
87
|
+
numberOfFiles = settings.getNumberOfFiles();
|
88
|
+
if (numberOfFiles && $.type(options.maxNumberOfFiles) === 'number' &&
|
89
|
+
numberOfFiles + data.files.length > options.maxNumberOfFiles) {
|
90
|
+
file.error = settings.i18n('maxNumberOfFiles');
|
91
|
+
} else if (options.acceptFileTypes &&
|
92
|
+
!(options.acceptFileTypes.test(file.type) ||
|
93
|
+
options.acceptFileTypes.test(file.name))) {
|
94
|
+
file.error = settings.i18n('acceptFileTypes');
|
95
|
+
} else if (options.maxFileSize && file.size > options.maxFileSize) {
|
96
|
+
file.error = settings.i18n('maxFileSize');
|
97
|
+
} else if ($.type(file.size) === 'number' &&
|
98
|
+
file.size < options.minFileSize) {
|
99
|
+
file.error = settings.i18n('minFileSize');
|
100
|
+
} else {
|
101
|
+
delete file.error;
|
102
|
+
}
|
103
|
+
if (file.error || data.files.error) {
|
104
|
+
data.files.error = true;
|
105
|
+
dfd.rejectWith(this, [data]);
|
106
|
+
} else {
|
107
|
+
dfd.resolveWith(this, [data]);
|
108
|
+
}
|
109
|
+
return dfd.promise();
|
110
|
+
}
|
111
|
+
|
112
|
+
}
|
113
|
+
|
114
|
+
});
|
115
|
+
|
116
|
+
}));
|