You may also like to read:

Introduction

This post is about how to download file from server using Angular framework. Angular is a UI framework for building rapid application development. Here we will use Angular 7 to download file from server side. You can use any server side technology and integrate this example with it for downloading file from server.

We will provide link as well as button on which user will click and download file from server.

We will also see how to give users save as option and how to display file content on the browser.

You may also like to read Download file from server using React.

Prerequisites

Angular 7, Node v11.3.0, npm 6.4.1

Example with Source Code

Go through the following steps for creating Angular project to download file from server using Angular.

Creating Project

Go through the link Creating Angular Project to create a new project. Make sure you give the project name as angular-file-download.

If you are asked to confirm Routing and default StyleSheet type, then you can press y as an answer as shown in below image:

download file from server using angular

Now we will edit or add the required files under angular-file-download/src/app directory.

Remember the file extention ts (service.ts) indicates TypeScript, which is a file type.

Creating Service Class

Service is one of fundamental blocks of every Angular application. Service is just a TypeScript class with or even without @Injectable decorator.

Once we create the service class we need to register it under app.module.ts file in providers array of @NgModule.

But here we won’t register in providers array of @NgModule, instead we will use @Injectable({providedIn: ‘root’}) to register it for the whole application.

@Injectable is a decorator that has a property providedIn. root means that we want to provide the service at the root level (AppModule).

When the service is provided at root level, Angular creates a single, shared instance of service and injects into any class that needs it. Registering the provider in the @Injectable metadata also allows Angular to optimize an application by removing the service if it is not used.

The below source code is written into file.service.ts file.

import {Injectable} from '@angular/core';
import {HttpResponse} from '@angular/common/http';
import {Http, ResponseContentType} from '@angular/http';
import {Observable} from 'rxjs';

@Injectable({ providedIn: 'root' })
export class FileService {

  constructor(private http: Http) {}

  downloadFile(): Observable<HttpResponse<Blob>>{		
		return this.http.get('http://localhost:8080/employees/download', { responseType: ResponseContentType.Blob });
   }
   
}

In the above service class we are using HTTP GET method to get the file content from the URL http://localhost:8080/employees/download.

We are also accepting response as Blob (Binary Large Object). You may also specify any value from supporting values, such as, json, blob, arraybuffer, text. You can have a look for more details on response type.

Creating Controller Class

We need controller class that handles request/response from clients or end users.

We will invoke the service class method in controller class for downloading file.

We have used three ways for downloading file – two ways for save as functionality and one way to show the file content on browser itself.

The below code is written in app.component.ts file.

Let’s break up the lines inside the download() function.

let blob:any = new Blob([response.blob()], { type: 'text/json; charset=utf-8' });

The above line create a Blob object with file content in response and expecting the file of JSON type.

const url= window.URL.createObjectURL(blob);
window.open(url);

The above two lines create a URL that will open the file with save as option.

fileSaver.saveAs(blob, 'employees.json');

The above line uses ready-made FileSaver module that will open the file with save as option.

So you can use any one of the above two approaches for save as option.

window.location.href = response.url

The above line shows the file content on browser, so it does not give you save as option.

import { Component } from '@angular/core';
import { FileService } from './file.service';
import * as fileSaver from 'file-saver';
import { HttpResponse } from '@angular/common/http';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'Angular File Download';
  
  constructor(private fileService: FileService) {}
  
  download() {
    this.fileService.downloadFile().subscribe(response => {
			//let blob:any = new Blob([response.blob()], { type: 'text/json; charset=utf-8' });
			//const url= window.URL.createObjectURL(blob);
			//window.open(url);
			window.location.href = response.url;
			//fileSaver.saveAs(blob, 'employees.json');
		}), error => console.log('Error downloading the file'),
                 () => console.info('File downloaded successfully');
  }
  
}

Creating View File

We have created service class to fetch file data from a server URL but we need to provide a link or button for downloading the file.

In the view file we will give users two options for downloading the same file. We will use link as well as button for downloading the same file from the server.

We call the download() function of controller class on click event.

The code is written into app.component.ts file.

<div style="text-align:center">
  <h1>
    Welcome to {{ title }}
  </h1>
</div>
<h2>Click below link to get employee data</h2>
<div>
    <h3>
		Using Link <br/>
		<a href="#" (click)="download()">Download Employee Data</a>
	</h3>
	
	<h3>Using Button</h3>
	<input type="button" (click)="download()" value="Download Employee Data"/>
</div>

Registering Http Module

In our service class we have used Http module which may not be found automatically. So we need to register it in providers array of @NgModule.

So make sure you have the app.modules.ts file with the following content.

In the below source, import {HttpModule} from ‘@angular/http’; and HttpModule inside imports: [ ] are included.

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import {HttpModule} from '@angular/http';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
	HttpModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Enough coding! Let’s test our application.

Testing the Application

Let’s assume that server side application is up and running and the URL http://localhost:8080/employees/download is accessible.

Run the Angular application angular-file-download by executing command ng serve –open. Your application will open at URL http://localhost:4200 in the browser and the page may look similar to the below image:

download file from server using angular

When you click on link or button for downloading file you will see below page with file save option:

download file from server using angular

When you use the code for displaying data on browser inside download() function of controller code and click on button or link, then you should see below output:

[{"id":1,"name":"Soumitra","email":"soumitra@email.com"},{"id":2,"name":"Liton","email":"liton@email.com"},{"id":3,"name":"Suman","email":"suman@email.com"},{"id":4,"name":"Debabrata","email":"debabrata@email.com"}]

Source Code

You can download source code.

For server side code you can read the post on Download file using Angular and Spring Boot.

You may also like to read Download file from server using React.

Thanks for reading.

Tags:

Leave a Reply

Your email address will not be published. Required fields are marked *