Skip to content

Commit 9dc787b

Browse files
committed
File reader Service/Configuration for directives
1 parent 45f399c commit 9dc787b

11 files changed

+156
-13
lines changed

package.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "fctrlx-angular-file-reader",
3-
"version": "1.0.4",
3+
"version": "1.1.0",
44
"description": "Angular library that helps convert file (from input[type=file]) to base64/arrayBuffer/text using FileReader API.",
55
"keywords": [
66
"angular",
@@ -16,7 +16,12 @@
1616
"file-to-base64",
1717
"file-to-array-buffer",
1818
"file-to-text",
19-
"filetotext"
19+
"filetotext",
20+
"file-reader-service",
21+
"file-reader-promise",
22+
"file-reader-promise-like",
23+
"file-reader-observable",
24+
"file-reader-observable-like"
2025
],
2126
"homepage": "https://github.com/facetrollex/fctrlx-angular-file-reader",
2227
"author": {

src/lib/directives/Base.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export class Base implements OnInit, OnDestroy {
4949
const reader = new FileReader();
5050
const { name, size, type } = files[key];
5151

52-
reader.onload = (file) => {
52+
reader.onloadend = (file) => {
5353
this.store(file, saveKey);
5454
};
5555

src/lib/directives/file-to-array-buffer.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
Output,
77
} from '@angular/core';
88
import { Base } from './Base';
9+
import { DirectiveConfig } from '../models/directive-config';
910

1011
@Directive({
1112
selector: '[fileToArrBuf]',
@@ -17,11 +18,17 @@ export class FileToArrayBuffer extends Base {
1718

1819
@Output() filesChange: EventEmitter<any> = new EventEmitter();
1920

21+
static readonly config: DirectiveConfig = {
22+
name: 'fileToArrBuf',
23+
method: 'readAsArrayBuffer',
24+
storeKey: 'arrBuf',
25+
};
26+
2027
constructor(element: ElementRef) {
21-
super('fileToArrBuf', element);
28+
super(FileToArrayBuffer.config.name, element);
2229
}
2330

2431
filesChanged(event: Event): void {
25-
super.filesChanged(event, 'readAsArrayBuffer', 'arrBuf');
32+
super.filesChanged(event, FileToArrayBuffer.config.method, FileToArrayBuffer.config.storeKey);
2633
}
2734
}

src/lib/directives/file-to-base64.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
Output,
77
} from '@angular/core';
88
import { Base } from './Base';
9+
import { DirectiveConfig } from '../models/directive-config';
910

1011
@Directive({
1112
selector: '[fileToBase64]',
@@ -17,11 +18,17 @@ export class FileToBase64 extends Base {
1718

1819
@Output() filesChange: EventEmitter<any> = new EventEmitter();
1920

21+
static readonly config: DirectiveConfig = {
22+
name: 'fileToBase64',
23+
method: 'readAsDataURL',
24+
storeKey: 'base64',
25+
};
26+
2027
constructor(element: ElementRef) {
21-
super('fileToBase64', element);
28+
super(FileToBase64.config.name, element);
2229
}
2330

2431
filesChanged(event: Event): void {
25-
super.filesChanged(event, 'readAsDataURL', 'base64');
32+
super.filesChanged(event, FileToBase64.config.method, FileToBase64.config.storeKey);
2633
}
2734
}

src/lib/directives/file-to-text.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
Output,
77
} from '@angular/core';
88
import { Base } from './Base';
9+
import { DirectiveConfig } from '../models/directive-config';
910

1011
@Directive({
1112
selector: '[fileToText]',
@@ -17,11 +18,17 @@ export class FileToText extends Base {
1718

1819
@Output() filesChange: EventEmitter<any> = new EventEmitter();
1920

21+
static readonly config: DirectiveConfig = {
22+
name: 'fileToText',
23+
method: 'readAsText',
24+
storeKey: 'text',
25+
};
26+
2027
constructor(element: ElementRef) {
21-
super('fileToText', element);
28+
super(FileToText.config.name, element);
2229
}
2330

2431
filesChanged(event: Event): void {
25-
super.filesChanged(event, 'readAsText', 'text');
32+
super.filesChanged(event, FileToText.config.method, FileToText.config.storeKey);
2633
}
2734
}

src/lib/models/directive-config.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export interface DirectiveConfig {
2+
name: string;
3+
method: string;
4+
storeKey: string;
5+
}

src/lib/services/Base.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { Observable, Observer } from 'rxjs';
2+
import { FileReaderInterface } from './file-reader.interface';
3+
4+
export class Base implements FileReaderInterface
5+
{
6+
private readonly TYPE_PROMISE: string = 'PROMISE';
7+
private readonly TYPE_SUBSCRIBER: string = 'OBSERVABLE';
8+
private readonly returnType: string;
9+
10+
constructor(returnType: string) {
11+
this.returnType = returnType;
12+
}
13+
14+
toBase64(file: File): Observable<string> | Promise<string> {
15+
const reader = new FileReader();
16+
reader.readAsDataURL(file);
17+
return this.response(reader);
18+
}
19+
20+
toText(file: File): Observable<string> | Promise<string> {
21+
const reader = new FileReader();
22+
reader.readAsText(file);
23+
return this.response(reader);
24+
}
25+
26+
toArrBuf(file: File): Observable<string> | Promise<string> {
27+
const reader = new FileReader();
28+
reader.readAsArrayBuffer(file);
29+
return this.response(reader);
30+
}
31+
32+
response(reader: FileReader): Observable<string> | Promise<string> {
33+
let response;
34+
35+
if (this.returnType === this.TYPE_SUBSCRIBER) {
36+
response = Observable.create((observer: Observer<string>) => {
37+
reader.onloadend = () => {
38+
observer.next(<string>reader.result);
39+
observer.complete();
40+
};
41+
42+
reader.onerror = (error) => {
43+
observer.next(<any>error);
44+
observer.complete();
45+
};
46+
});
47+
} else if (this.returnType === this.TYPE_PROMISE) {
48+
response = new Promise((resolve, reject) => {
49+
reader.onloadend = () => resolve(<string>reader.result);
50+
reader.onerror = error => reject(<any>error);
51+
});
52+
}
53+
54+
return response;
55+
}
56+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Injectable } from '@angular/core';
2+
import { Observable } from 'rxjs';
3+
import { Base } from './Base';
4+
import { FileReaderInterface } from './file-reader.interface';
5+
6+
@Injectable({
7+
providedIn: 'root',
8+
})
9+
export class FileReaderObservableLikeService extends Base implements FileReaderInterface
10+
{
11+
constructor() {
12+
super('OBSERVABLE');
13+
}
14+
15+
toBase64(file: File): Observable<string> {
16+
return <Observable<string>>super.toBase64(file);
17+
}
18+
19+
toText(file: File): Observable<string> {
20+
return <Observable<string>>super.toText(file);
21+
}
22+
23+
toArrBuf(file: File): Observable<string> {
24+
return <Observable<string>>super.toArrBuf(file);
25+
}
26+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { Injectable } from '@angular/core';
2+
import { Base } from './Base';
3+
import { FileReaderInterface } from './file-reader.interface';
4+
5+
@Injectable({
6+
providedIn: 'root',
7+
})
8+
export class FileReaderPromiseLikeService extends Base implements FileReaderInterface
9+
{
10+
constructor() {
11+
super('PROMISE');
12+
}
13+
14+
toBase64(file: File): Promise<string> {
15+
return <Promise<string>>super.toBase64(file);
16+
}
17+
18+
toText(file: File): Promise<string> {
19+
return <Promise<string>>super.toText(file);
20+
}
21+
22+
toArrBuf(file: File): Promise<string> {
23+
return <Promise<string>>super.toArrBuf(file);
24+
}
25+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { Observable } from 'rxjs';
2+
3+
export interface FileReaderInterface {
4+
toBase64(file: File): Observable<string> | Promise<string>;
5+
toText(file: File): Observable<string> | Promise<string>;
6+
toArrBuf(file: File): Observable<string> | Promise<string>;
7+
}

0 commit comments

Comments
 (0)