Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to upload file in Angular2

I have to submit a form along with image. i have tried this code (with multiple ways) but did't work for me. is there anyone having working demo of file uploading using angular2 please help me out.

component.html

    <form class="form-horizontal" role="form" >          <div class="form-group">             <label class="control-label col-sm-4" for="myname" style="">Name<span class="asterisk">*</span></label>             <div class="col-sm-7">                 <div>                     <input type="text" class="form-control" id="myname"                     [(ngModel)]="myfile.name">                                         </div>                               </div>                                        </div>                   <div class="form-group">             <label class="control-label col-sm-4" for="myimage">Image</label>             <div class="col-sm-7">                 <div>                     <input type="file" (change)="fileChangeEvent($event)" placeholder="Upload file..." />                                          </div>                </div>         </div>           <div class="form-group">                 <div class="text-center">             <button type="button" (click)="upload()">Upload</button>                      </div>         </div>   </form> 

component.ts

     myfile={                 "name":"Mubashshir",                                "image":''      }       fileChangeEvent(fileInput: any){         this.myfile.image = fileInput.target.files;              }       upload(){           this.base_path_service.PostRequest('http://128.199.190.109/api/school/schoolDetail/',this.myfile)             .subscribe(                 data => {                             console.log("data submitted");                                                 },                 err => console.log(err),                 () =>{                      console.log('Authentication Complete');                                      }             );       } 
like image 365
Mubashir Avatar asked Mar 14 '16 10:03

Mubashir


People also ask

How to upload file using Angular and Web API?

Use the Angular CLI command ng g cl to create a new class that represents a file to upload. You can create a folder named file-upload at the same time you create the FileToUpload class. The FileToUpload class will be created in this new folder. Open the newly generated file-to-upload.


2 Answers

In fact, the Http class doesn't support that at the moment.

You need to leverage the underlying XHR object to do that:

import {Injectable} from 'angular2/core'; import {Observable} from 'rxjs/Rx';  @Injectable() export class UploadService {   constructor () {     this.progress$ = Observable.create(observer => {       this.progressObserver = observer     }).share();   }    private makeFileRequest (url: string, params: string[], files: File[]): Observable {     return Observable.create(observer => {       let formData: FormData = new FormData(),         xhr: XMLHttpRequest = new XMLHttpRequest();        for (let i = 0; i < files.length; i++) {         formData.append("uploads[]", files[i], files[i].name);       }        xhr.onreadystatechange = () => {         if (xhr.readyState === 4) {           if (xhr.status === 200) {             observer.next(JSON.parse(xhr.response));             observer.complete();           } else {             observer.error(xhr.response);           }         }       };        xhr.upload.onprogress = (event) => {         this.progress = Math.round(event.loaded / event.total * 100);          this.progressObserver.next(this.progress);       };        xhr.open('POST', url, true);       xhr.send(formData);     });   } } 

See this plunkr for more details: https://plnkr.co/edit/ozZqbxIorjQW15BrDFrg?p=info.

There is a an issue and a pending PR regarding this in the Angular repo:

  • https://github.com/angular/angular/issues/10424
  • https://github.com/angular/angular/pull/7310/files
like image 74
Thierry Templier Avatar answered Oct 07 '22 22:10

Thierry Templier


your http service file:

import { Injectable } from "@angular/core"; import { ActivatedRoute, Router } from '@angular/router'; import { Http, Headers, Response, Request, RequestMethod, URLSearchParams, RequestOptions } from "@angular/http"; import {Observable} from 'rxjs/Rx'; import { Constants } from './constants'; declare var $: any;  @Injectable() export class HttpClient {   requestUrl: string;   responseData: any;   handleError: any;    constructor(private router: Router,    private http: Http,    private constants: Constants,    ) {     this.http = http;   }    postWithFile (url: string, postData: any, files: File[]) {      let headers = new Headers();     let formData:FormData = new FormData();     formData.append('files', files[0], files[0].name);     // For multiple files     // for (let i = 0; i < files.length; i++) {     //     formData.append(`files[]`, files[i], files[i].name);     // }      if(postData !=="" && postData !== undefined && postData !==null){       for (var property in postData) {           if (postData.hasOwnProperty(property)) {               formData.append(property, postData[property]);           }       }     }     var returnReponse = new Promise((resolve, reject) => {       this.http.post(this.constants.root_dir + url, formData, {         headers: headers       }).subscribe(           res => {             this.responseData = res.json();             resolve(this.responseData);           },           error => {             this.router.navigate(['/login']);             reject(error);           }       );     });     return returnReponse;   } } 

call your function (Component file):

onChange(event) {     let file = event.srcElement.files;     let postData = {field1:"field1", field2:"field2"}; // Put your form data variable. This is only example.     this._service.postWithFile(this.baseUrl + "add-update",postData,file).then(result => {         console.log(result);     }); } 

your html code:

<input type="file" class="form-control" name="documents" (change)="onChange($event)" [(ngModel)]="stock.documents" #documents="ngModel"> 
like image 43
Bharat Chauhan Avatar answered Oct 07 '22 20:10

Bharat Chauhan