@clemox/ngx-file-saver
Version:
URL or blob download helper
86 lines (81 loc) • 2.83 kB
JavaScript
import * as i0 from '@angular/core';
import { Injectable } from '@angular/core';
class NgxFileSaverService {
saveUrl(url, fileName) {
const anchor = this.clickUrlPrepare(url, fileName);
if (anchor === undefined) {
this.downloadProcess(url, fileName);
}
else {
this.clickUrlProcess(anchor);
}
}
saveBlob(data, fileName) {
const anchor = this.clickBlobPrepare(data, fileName);
this.clickBlobProcess(anchor);
}
//
clickUrlPrepare(url, name) {
let result = document.createElement('a');
result.download = name;
result.href = url;
result.rel = 'noopener';
if (result.origin !== undefined && result.origin !== window.location.origin) {
result.target = '_blank';
if (this.isCorsEnabled(result.href)) {
result = undefined;
}
}
return result;
}
clickUrlProcess(anchor) {
try {
anchor.dispatchEvent(new MouseEvent('click'));
}
catch (e) {
anchor.click();
}
}
clickBlobPrepare(data, name) {
const result = document.createElement('a');
result.download = name;
result.href = URL.createObjectURL(data);
result.rel = 'noopener';
return result;
}
clickBlobProcess(anchor) {
setTimeout(() => { URL.revokeObjectURL(anchor.href); }, 4E4); // 40s
setTimeout(() => { this.clickUrlProcess(anchor); }, 0);
}
downloadProcess(url, name) {
const xhr = new XMLHttpRequest();
xhr.responseType = 'blob';
xhr.open('GET', url);
xhr.onload = (() => this.saveBlob(xhr.response, name));
xhr.onerror = (() => console.error('could not download file'));
xhr.send();
}
isCorsEnabled(url) {
const xhr = new XMLHttpRequest();
xhr.open('HEAD', url, false);
try {
xhr.send();
}
catch (e) { }
return (xhr.status >= 200 && xhr.status <= 299);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: NgxFileSaverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: NgxFileSaverService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: NgxFileSaverService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}] });
/*
* Public API Surface of ngx-file-saver
*/
/**
* Generated bundle index. Do not edit.
*/
export { NgxFileSaverService };
//# sourceMappingURL=clemox-ngx-file-saver.mjs.map