loop-modules
Version:
Shared modules for the Loop product suite.
59 lines (50 loc) • 1.71 kB
text/typescript
// angular
import { Injectable } from '@angular/core';
// libs
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Observable } from 'rxjs/Observable';
/**
* The service responsible for managing file-uploads to a remote server via XHR request
* @author Sean Perkins <sean@meetmaestro.com | sean-perkins>
*
* @export
* @class FileUploadService
*/
()
export class FileUploadService {
/**
* Public observable event hook for listening for progress, success and failure on the upload
*
* @type {Observable<number>}
* @memberOf FileUploadService
*/
progress$: Observable<number>;
private progressSource = new BehaviorSubject<number>(0);
constructor() {
this.progress$ = this.progressSource.asObservable();
}
/**
* Handles an upload request to a server
*
* @param {string} url The location of the server to post the file to
* @param {FormData} formData The file's form data properties
*
* @memberOf FileUploadService
*/
upload(url: string, formData: FormData) {
let xhr: XMLHttpRequest = new XMLHttpRequest();
xhr.upload.onprogress = (event: any) => {
let progress = Math.round(event.loaded / event.total * 100);
this.progressSource.next(progress);
}
xhr.addEventListener('load', () => {
this.progressSource.complete();
}, false);
xhr.addEventListener('error', (error: any) => {
this.progressSource.error(error);
}, false);
xhr.open('POST', url, true);
xhr.setRequestHeader('Access-Control-Allow-Origin', window.location.origin);
xhr.send(formData);
}
}