I use angular 6 and I was following along this video tutorial to submit images.
I would like to observe the progress of the form submission, so I can get the percentage of the uploaded file.
I have this in my component
import { HttpClient,HttpEventType } from '@angular/common/http';
import { Http, Headers } from '@angular/http';
  constructor(
    private formBuilder: FormBuilder, 
    private myService:MyService,
    private changeDetector: ChangeDetectorRef,
    private carouselConfig : NgbCarouselConfig    ,
    private http:HttpClient
   ) { }
    let headers = new Headers();    
    headers.append('Authorization',this.token);    
    let eb =null;
    this.http.post('http://localhost:3000/cms/upload',formData,{reportProgress:true,observe:'events'}).subscribe(
      event=>{        
        if(event.type === HttpEventType.UploadProgress){
          let pv = Math.round(event.loaded / event.total *100);
          this.imguploadprogress.nativeElement.value =  pv;          
        }
        else if(event.type === HttpEventType.Response){     
          eb = event.body;              
          if(eb.success){                  
            this.imguploadprogress.nativeElement.value =  100;                                   
            this.imageMsg='All good';                                       
          }
          else{
            this.imguploadprogress.nativeElement.value =  0;
            this.imageMsg='nope;        
          }
        }        
    }); 
This works fine.
I try to "split" this now in two parts. Turn the post and its headers and its parameters to a function in my service, and just subscribe and get the results in the component. I try to do this:
myapp.component.ts
this.myService.uploadImage(form).subscribe(
  e=>{
    console.log('e- ',e);
  }
);
and in my service 
myapp.service.ts
  uploadImage(data) {
    let formData = new FormData(data);
    let headers = new Headers();    
    headers.append('Authorization',this.token);
    return this.http.post('http://localhost:3000/cms/upload',formData,{reportProgress:true, observe:'events', headers:headers});
  }
VScode says Argument of type {reportProgress:boolean;observe:string;headers:Headers} is not assingable to parameter of type RequestOptionsArgs
During compile I get Object literal may only specify known properties, and 'reportProgress' does not exist in type 'RequestOptionsArgs'. and when I try to use the form I get just the final response object back, with no event info in between. 
So, how can I properly set my RequestOptionsArgs ?
Thanks
I think you are mixing APIs, reportProgress is a property of HttpRequest<T> which lives in @angular/common/http.
In your example, it seems you are basing your service in the Angular 6 Http injectable service from the HttpModule in @angular/http.
Instead, use the request method from HttpClient that comes in @angular/common/http.
Also, make sure you use HttpHeaders from @angular/common/http as well.
The following will work:
uploadImage(data) {
  let formData = new FormData(data);
  let headers = new HttpHeaders().append('Authorization', this.token);
  return this.httpClient.post(
    'http://localhost:3000/cms/upload',
    formData,
    {
      reportProgress: true,
      observe: 'events',
      headers: headers
    });
}
Of course you will have to import:
import { HttpClient, HttpHeaders } from '@angular/common/http';
And inject the HttpClient in your service constructor:
constructor(private httpClient: HttpClient) { ... }
I hope this explains and resolves your issue!
Your third argument to http.post is the httpOptions, yours looks like
{reportProgress:true, observe:'events', headers:headers}
According to the good ol' https://angular.io/guide/http
it is shown an example where they use:
{ observe: 'response' }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With