From e99a7d47c92346edcb8cf1971dd085d1fc039379 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Thu, 12 Oct 2023 15:56:50 +0300 Subject: [PATCH] add FileUtilsService to provide utility methods for file operations in Angular --- docs/en/UI/Angular/File-Utils-Service.md | 37 +++++++++++++++++++ docs/en/docs-nav.json | 4 ++ .../src/lib/services/file-utils.service.ts | 29 +++++++++++++++ .../packages/core/src/lib/services/index.ts | 1 + 4 files changed, 71 insertions(+) create mode 100644 docs/en/UI/Angular/File-Utils-Service.md create mode 100644 npm/ng-packs/packages/core/src/lib/services/file-utils.service.ts diff --git a/docs/en/UI/Angular/File-Utils-Service.md b/docs/en/UI/Angular/File-Utils-Service.md new file mode 100644 index 0000000000..ea6ed4a7cf --- /dev/null +++ b/docs/en/UI/Angular/File-Utils-Service.md @@ -0,0 +1,37 @@ +# File Utils Service +FileUtilsService is an Angular service designed to provide utility methods related to file operations. The service has a `downloadBlob` function, which is used for downloading blobs as files within the context of a web application. + +## Usage + +To make use of the FileUtilsService in your Angular application, follow the steps below: + +Injection: +Firstly, ensure that the service is injected into the component or any other Angular entity where you wish to use it. + +```js +import { FileUtilsService } from '@abp/ng.core'; + +constructor(private fileUtils: FileUtilsService) { } +// or +// private fileUtils = inject(FileUtilsService) +``` + +Downloading a Blob: + +Once you have the service injected, you can use the downloadBlob method to initiate the download of blob data as a file. For instance: + +```js +someMethod() { + const myBlob = new Blob(["Hello, World!"], { type: "text/plain" }); + this.fileUtils.downloadBlob(myBlob, "hello.txt"); +} +``` + +Permissions & Considerations: + +Ensure that you have appropriate permissions and user interactions before triggering a download. Since downloadBlob initiates a download programmatically, it's best to tie this action to direct user interactions, such as button clicks, to prevent unexpected behaviors or browser restrictions. + + +### DOCUMENT Token in Service + +Angular, being a platform-agnostic framework, is designed to support not only browser-based applications but also other environments like server-side rendering (SSR) through Angular Universal. This design philosophy introduces challenges when accessing global browser-specific objects like window or document directly. To address this, Angular provides a DOCUMENT token that can be used to inject the document object into Angular entities like components and services. \ No newline at end of file diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index afdf89657c..cfe52ffd78 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -1153,6 +1153,10 @@ { "text": "Content Security Strategy", "path": "UI/Angular/Content-Security-Strategy.md" + }, + { + "text":"File Utils Service", + "path":"UI/Angular/File-Utils-Service.md" } ] }, diff --git a/npm/ng-packs/packages/core/src/lib/services/file-utils.service.ts b/npm/ng-packs/packages/core/src/lib/services/file-utils.service.ts new file mode 100644 index 0000000000..32a5bea88b --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/services/file-utils.service.ts @@ -0,0 +1,29 @@ +import { Injectable, inject } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; + +@Injectable({ + providedIn: 'root', +}) +export class FileUtilsService { + protected readonly document = inject(DOCUMENT); + get window() { + return this.document.defaultView; + } + downloadBlob(blob: Blob, fileName: string) { + const blobUrl = this.window.URL.createObjectURL(blob); + const a = this.document.createElement('a'); + a.style.display = 'none'; + a.href = blobUrl; + a.download = fileName; + this.document.body.appendChild(a); + a.dispatchEvent( + new MouseEvent('click', { + bubbles: true, + cancelable: true, + view: this.window, + }), + ); + this.window.URL.revokeObjectURL(blobUrl); + this.document.body.removeChild(a); + } +} diff --git a/npm/ng-packs/packages/core/src/lib/services/index.ts b/npm/ng-packs/packages/core/src/lib/services/index.ts index 9b193ab67f..43b7865d95 100644 --- a/npm/ng-packs/packages/core/src/lib/services/index.ts +++ b/npm/ng-packs/packages/core/src/lib/services/index.ts @@ -21,3 +21,4 @@ export * from './track-by.service'; export * from './local-storage.service'; export * from './window.service'; export * from './internet-connection-service' +export * from './file-utils.service'