Created
November 7, 2019 23:55
-
-
Save nara-l/41bb335b8300382ad9c56e1db52a2dc3 to your computer and use it in GitHub Desktop.
Asynchronous mime-type Validator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { AbstractControl } from '@angular/forms'; | |
import {Observable, Observer, of} from 'rxjs'; | |
export const mimeType = ( | |
control: AbstractControl | |
): Promise<{ [key: string]: any }> | Observable<{ [key: string]: any }> => { | |
if (typeof(control.value) === 'string') { | |
return of(null); | |
} | |
const file = control.value as File; | |
const fileReader = new FileReader(); | |
const frObs = Observable.create( | |
(observer: Observer<{ [key: string]: any }>) => { | |
fileReader.addEventListener('loadend', () => { | |
// @ts-ignore | |
const arr = new Uint8Array(fileReader.result).subarray(0, 4); | |
let header = ''; | |
let isValid = false; | |
for (let i = 0; i < arr.length; i++) { | |
header += arr[i].toString(16); | |
} | |
switch (header) { | |
case '89504e47': | |
isValid = true; | |
break; | |
case 'ffd8ffe0': | |
case 'ffd8ffe1': | |
case 'ffd8ffe2': | |
case 'ffd8ffe3': | |
case 'ffd8ffe8': | |
isValid = true; | |
break; | |
default: | |
isValid = false; // Or you can use the blob.type as fallback | |
break; | |
} | |
if (isValid) { | |
observer.next(null); | |
} else { | |
observer.next({ invalidMimeType: true }); | |
} | |
observer.complete(); | |
}); | |
fileReader.readAsArrayBuffer(file); | |
} | |
); | |
return frObs; | |
}; | |
https://mydev.life/2019/04/19/asynchronous-mime-type-validator-for-file-inputs-in-angular-reactive-forms/ | |
foriginal source from academind packpub.com angular course |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment