File Upload In Angular? File Upload In Angular? angular angular

File Upload In Angular?


Angular 2 provides good support for uploading files. No third party library is required.

<input type="file" (change)="fileChange($event)" placeholder="Upload file" accept=".pdf,.doc,.docx">
fileChange(event) {    let fileList: FileList = event.target.files;    if(fileList.length > 0) {        let file: File = fileList[0];        let formData:FormData = new FormData();        formData.append('uploadFile', file, file.name);        let headers = new Headers();        /** In Angular 5, including the header Content-Type can invalidate your request */        headers.append('Content-Type', 'multipart/form-data');        headers.append('Accept', 'application/json');        let options = new RequestOptions({ headers: headers });        this.http.post(`${this.apiEndPoint}`, formData, options)            .map(res => res.json())            .catch(error => Observable.throw(error))            .subscribe(                data => console.log('success'),                error => console.log(error)            )    }}

using @angular/core": "~2.0.0" and @angular/http: "~2.0.0"


From the answers above I build this with Angular 5.x

Just call uploadFile(url, file).subscribe() to trigger an upload

import { Injectable } from '@angular/core';import {HttpClient, HttpParams, HttpRequest, HttpEvent} from '@angular/common/http';import {Observable} from "rxjs";@Injectable()export class UploadService {  constructor(private http: HttpClient) { }  // file from event.target.files[0]  uploadFile(url: string, file: File): Observable<HttpEvent<any>> {    let formData = new FormData();    formData.append('upload', file);    let params = new HttpParams();    const options = {      params: params,      reportProgress: true,    };    const req = new HttpRequest('POST', url, formData, options);    return this.http.request(req);  }}

Use it like this in your component

  // At the drag drop area  // (drop)="onDropFile($event)"  onDropFile(event: DragEvent) {    event.preventDefault();    this.uploadFile(event.dataTransfer.files);  }  // At the drag drop area  // (dragover)="onDragOverFile($event)"  onDragOverFile(event) {    event.stopPropagation();    event.preventDefault();  }  // At the file input element  // (change)="selectFile($event)"  selectFile(event) {    this.uploadFile(event.target.files);  }  uploadFile(files: FileList) {    if (files.length == 0) {      console.log("No file selected!");      return    }    let file: File = files[0];    this.upload.uploadFile(this.appCfg.baseUrl + "/api/flash/upload", file)      .subscribe(        event => {          if (event.type == HttpEventType.UploadProgress) {            const percentDone = Math.round(100 * event.loaded / event.total);            console.log(`File is ${percentDone}% loaded.`);          } else if (event instanceof HttpResponse) {            console.log('File is completely loaded!');          }        },        (err) => {          console.log("Upload Error:", err);        }, () => {          console.log("Upload done");        }      )  }


Thanks to @Eswar. This code worked perfectly for me. I want to add certain things to the solution :

I was getting error : java.io.IOException: RESTEASY007550: Unable to get boundary for multipart

In order to solve this error, you should remove the "Content-Type" "multipart/form-data". It solved my problem.