Angular File Upload

后端 未结 12 2001
名媛妹妹
名媛妹妹 2020-11-22 10:04

I\'m a beginner with Angular, I want to know how to create Angular 5 File upload part, I\'m trying to find any tutorial or doc, but I don\'t see anything a

12条回答
  •  花落未央
    2020-11-22 10:45

    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(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:

    Check out this tutorial and this post

提交回复
热议问题