First, you need to set up HttpClient in your Angular project.
Open the src/app/app.module.ts file, import HttpClientModule and add it to the imports array of the module as follows:
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { HttpClientModule } from '@angular/common/http'; @NgModule({ declarations: [ AppComponent, ], imports: [ BrowserModule, AppRoutingModule, HttpClientModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
Next, generate a component:
$ ng generate component home
Next, generate an upload service:
$ ng generate service upload
Next, open the src/app/upload.service.ts file as follows:
import { HttpClient, HttpEvent, HttpErrorResponse, HttpEventType } from '@angular/common/http'; import { map } from 'rxjs/operators'; @Injectable({ providedIn: 'root' }) export class UploadService { SERVER_URL: string = "https://file.io/"; constructor(private httpClient: HttpClient) { } public upload(formData) { return this.httpClient.post<any>(this.SERVER_URL, formData, { reportProgress: true, observe: 'events' }); } }
Next, open the src/app/home/home.component.ts file, and start by adding the following imports:
import { Component, OnInit, ViewChild, ElementRef } from '@angular/core'; import { HttpEventType, HttpErrorResponse } from '@angular/common/http'; import { of } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; import { UploadService } from '../upload.service';
Next, define the fileUpload and files variables and inject UploadService as follows:
@Component({ selector: 'app-home', templateUrl: './home.component.html', styleUrls: ['./home.component.css'] }) export class HomeComponent implements OnInit { @ViewChild("fileUpload", {static: false}) fileUpload: ElementRef;files = []; constructor(private uploadService: UploadService) { }
Next, define the uploadFile() method:
uploadFile(file) { const formData = new FormData(); formData.append('file', file.data); file.inProgress = true; this.uploadService.upload(formData).pipe( map(event => { switch (event.type) { case HttpEventType.UploadProgress: file.progress = Math.round(event.loaded * 100 / event.total); break; case HttpEventType.Response: return event; } }), catchError((error: HttpErrorResponse) => { file.inProgress = false; return of(`${file.data.name} upload failed.`); })).subscribe((event: any) => { if (typeof (event) === 'object') { console.log(event.body); } }); }
Next, define the uploadFiles() method which can be used to upload multiple image files:
private uploadFiles() { this.fileUpload.nativeElement.value = ''; this.files.forEach(file => { this.uploadFile(file); }); }
Next, define the onClick() method:
onClick() { const fileUpload = this.fileUpload.nativeElement;fileUpload.onchange = () => { for (let index = 0; index < fileUpload.files.length; index++) { const file = fileUpload.files[index]; this.files.push({ data: file, inProgress: false, progress: 0}); } this.uploadFiles(); }; fileUpload.click(); }
Next, we need to create the HTML template of our image upload UI. Open the src/app/home/home.component.html file and add the following content:
<div [ngStyle]="{'text-align':center; 'margin-top': 100px;}"> <button mat-button color="primary" (click)="fileUpload.click()">choose file</button> <button mat-button color="warn" (click)="onClick()">Upload</button> <input [hidden]="true" type="file" #fileUpload id="fileUpload" name="fileUpload" multiple="multiple" accept="image/*" /> </div>
Check out this tutorial and this post