Skip to content

Instantly share code, notes, and snippets.

@nara-l
Created November 7, 2019 23:55
Show Gist options
  • Save nara-l/41bb335b8300382ad9c56e1db52a2dc3 to your computer and use it in GitHub Desktop.
Save nara-l/41bb335b8300382ad9c56e1db52a2dc3 to your computer and use it in GitHub Desktop.
Asynchronous mime-type Validator
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