This is the second part of the File uploading example using NestJS and Angular 11 - Part 1. In this article, I am going to talk about how to create a client application using Angular 11.
Create a new Angular application using Angular CLI
- As I mentioned in the previous article, Angular CLI needs to be installed.
- Then hit the below command to create a new Angular application.
- automobile-frontend is my application name.
ng new automobile-frontend
Run Angular application
- Go inside the automobile-frontend directory.
- Then hit the below command to run the application.
ng serve -o
- Now your client application will run on port 4200 and the default page will be shown.
Expected UI
- I will be using a basic fixed navbar, the navbar component will handle this.
- The home component will be used as a parent component for routing
Create the basic structure
- I am going to create some components for this application.
Create components
- I am going to create three components, called home, navbar, and upload.
- Create the home component.
ng g c home --skip-tests=true
- Create the upload component
ng g c upload --skip-tests=true
- Create the navbar component
ng g c navbar --skip-tests=true
- The above screenshot shows all components that we have created and their selectors (selector name can be changed. But I will use default selectors.
- app-home
- app-navbar
- app-upload
Install Bootstrap
- I am using a simple Bootstrap template in this application.
- So we need to install Bootstrap.
- You can install Bootstrap or you can use ng-bootstrap as well. But I am using Bootstrap 3, old but simple to use. You can use any preferred version.
npm install bootstrap@3.3.7
- Then add @import "~bootstrap/dist/css/bootstrap.css"; into the styles.css file
- I am not going to add jquery for this project.
Add a template for the navbar
- I will use a basic bootstrap navbar template.
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="/">Automobile system</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="/">Home <span class="sr-only">(current)</span></a></li>
<li><a [routerLink]="'/upload'" routerLinkActive="active">Upload file</a></li>
</ul>
</div>
</div>
</nav>
- In the future, I will add more to this navbar.
- As you can see I've used routerLink to route the upload component
- Here is the app-routing.module.ts file
- In this file, I have created a route to the upload component.
- Then /upload will route to the upload component.
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { UploadComponent } from './upload/upload.component';
const routes: Routes = [
{
path: 'upload',
pathMatch: 'full',
component: UploadComponent
}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
Refactor home-component
- The home-component will be used for routing.
- All other components except nav-bar will be inside of the home-component.
- Changes are not required for the home.component.ts file.
- The only thing you need to do is, add the following line to the home.component.html file
<router-outlet></router-outlet>
Add upload functionality
- Once the user clicks on the upload file in the navbar, the upload component will take the user.
- In the upload component, I am going to handle the file uploading form and its functionalities.
- Look at the upload.component.html file
<div class="container container-table">
<div class="row vertical-center-row">
<div class="text-center col-md-4 col-md-offset-4">
<form [formGroup]="myForm" (ngSubmit)="submit()">
<div class="form-group">
<label for="file">Please select the csv file</label>
<input formControlName="file" id="csv" type="file" class="form-control"
(change)="onFileChange($event)" multiple>
</div>
<button class="btn btn-primary" type="submit">Upload</button>
</form>
</div>
</div>
</div>
- Here I am using a simple reactive form.
- Now check how the upload.component.ts file looks like.
import { Component } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-upload',
templateUrl: './upload.component.html',
styleUrls: ['./upload.component.css']
})
export class UploadComponent {
myForm = new FormGroup({
file: new FormControl('', [Validators.required]),
fileSource: new FormControl('', [Validators.required])
});
constructor(private http: HttpClient) { }
get f() {
return this.myForm.controls;
}
onFileChange(event: any) {
if (event.target.files.length > 0) {
const csv = event.target.files[0];
this.myForm.patchValue({ fileSource: csv });
}
}
submit() {
const formData = new FormData();
formData.append('csv', this.myForm.get('fileSource')!.value);
this.http.post('http://localhost:3000/api/vehicles/upload', formData)
.subscribe((data) => {
if (data === null) {
alert("Data import error")
} else {
alert("Data imported successfully")
}
}
)
}
}
- The HttpClient is used to call our back-end API for file uploading and our back-end service also need to start. The back-end service will run on port 3000 (http://localhost:3000/api/vehicles/upload)
- To make this work, you need to import used modules in the app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { HomeComponent } from './home/home.component';
import { UploadComponent } from './upload/upload.component';
import { NavbarComponent } from './navbar/navbar.component';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
@NgModule({
declarations: [
AppComponent,
HomeComponent,
UploadComponent,
NavbarComponent
],
imports: [
BrowserModule,
AppRoutingModule,
FormsModule,
HttpClientModule,
ReactiveFormsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
- Now we are all set to launch.
- If you have any doubts or missing parts, please check the given Github link at the end of this article.
Test the application
- Now you can select a CSV file (I already shared a CSV file in the GIT repository) and upload it to check everything works fine.
- You may check consoles for any errors and if you are getting any errors, please check your code with my code.
- Here is the link for the Github repository for the complete project.
Please read the next article, Use Bull with NextJS I will be doing the same scenario using the BullJS, the queue operations with NestJS.
Part 03: Use Bull with NextJS
File uploading example using NestJS and Angular 11 - Part 2
Reviewed by Ravi Yasas
on
4:44 PM
Rating:

No comments: