From 385c322d3d158a4eb7533802384562921da6d9fe Mon Sep 17 00:00:00 2001 From: Koen van der Linden Date: Tue, 3 Apr 2018 10:43:14 +0200 Subject: [PATCH] feat(fileUploader): Added queueMaxSizeLimit, to limit the file size of all items in the uploadqueue. --- README.md | 1 + src/file-upload/file-uploader.class.ts | 16 ++++++++++++++++ src/spec/file-select.directive.spec.ts | 1 + 3 files changed, 18 insertions(+) diff --git a/README.md b/README.md index a422bdfe..dd2103cc 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ Easy to use Angular2 directives for files upload ([demo](http://valor-software.g 5. `formatDataFunction` - Function to modify the request body. 'DisableMultipart' must be 'true' for this function to be called. 6. `formatDataFunctionIsAsync` - Informs if the function sent in 'formatDataFunction' is asynchronous. Defaults to false. 7. `parametersBeforeFiles` - States if additional parameters should be appended before or after the file. Defaults to false. + 8. `queueMaxSizeLimit` - States the maximum allowed size (in bytes) of all files in the queue that are going to be uploaded. ### Events diff --git a/src/file-upload/file-uploader.class.ts b/src/file-upload/file-uploader.class.ts index 0a60acfe..dc86978f 100644 --- a/src/file-upload/file-uploader.class.ts +++ b/src/file-upload/file-uploader.class.ts @@ -30,6 +30,7 @@ export interface FileUploaderOptions { authToken?: string; maxFileSize?: number; queueLimit?: number; + queueMaxSizeLimit? : number; removeAfterUpload?: boolean; url?: string; disableMultipart?: boolean; @@ -77,6 +78,10 @@ export class FileUploader { this.autoUpload = this.options.autoUpload; this.options.filters.unshift({ name: 'queueLimit', fn: this._queueLimitFilter }); + if (this.options.queueMaxSizeLimit) { + this.options.filters.unshift({ name: 'queueMaxSizeLimit', fn: this._queueMaxSizeLimitFilter }); + } + if (this.options.maxFileSize) { this.options.filters.unshift({ name: 'fileSize', fn: this._fileSizeFilter }); } @@ -420,6 +425,17 @@ export class FileUploader { return this.options.queueLimit === undefined || this.queue.length < this.options.queueLimit; } + protected _queueMaxSizeLimitFilter(item: FileLikeObject): boolean { + let queueFileSize = 0; + let queueNotProcessedItems = this.queue.filter(queuedItem => !(queuedItem.isSuccess || queuedItem.isCancel || queuedItem.isError)); + if(queueNotProcessedItems.length>0) + { + // total size of all queued items that are going to be uploaded + queueFileSize = queueNotProcessedItems.map(queuedItem => queuedItem.file.size).reduce((fileSizeA,fileSizeB)=> fileSizeA + fileSizeB); + } + return this.options.queueMaxSizeLimit === undefined || (queueFileSize + item.size) < this.options.queueMaxSizeLimit; + } + protected _isValidFile(file: FileLikeObject, filters: FilterFunction[], options: FileUploaderOptions): boolean { this._failFilterIndex = -1; return !filters.length ? true : filters.every((filter: FilterFunction) => { diff --git a/src/spec/file-select.directive.spec.ts b/src/spec/file-select.directive.spec.ts index dfddc526..04537ae9 100644 --- a/src/spec/file-select.directive.spec.ts +++ b/src/spec/file-select.directive.spec.ts @@ -63,6 +63,7 @@ describe('Directive: FileSelectDirective', () => { expect(options.isHTML5).toBeTruthy(); expect(options.removeAfterUpload).toBeFalsy(); expect(options.disableMultipart).toBeFalsy(); + expect(options.queueMaxSizeLimit).toBeUndefined(); }); it('can get filters', () => {