Problem
I try to upload an image with angular's HttpClient
to API Content-Type: multipart/form-data
(angular v4+). Is it supported? How to do it?
The upload works with XMLHttpRequest
when using module like ng2-fancy-image-uploader
. I would prefer to use a custom method with HttpClient
which i could put into a http service together with other methods for accessing API.
Here is what i have tried so far:
model.service.ts
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http';
import 'rxjs/add/operator/toPromise';
@Injectable()
export class ModelService {
constructor(private http: HttpClient) { }
public async updateAvatar(file: File): Promise<void> {
// headers
const headers = new HttpHeaders()
.append('Content-Type', 'multipart/form-data');
const formData: FormData = new FormData();
formData.append('avatar', file, file.name);
const response: HttpResponse = await this.http
.patch('https://example.com/avatar', formData, { headers, observe: 'response' })
.toPromise();
console.log(response.status);
}
}
avatar-uploader.component.ts
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { ModelService } from './path/to/model.service';
@Component({
selector: 'app-avatar-uploader',
template: '<input type="file" #fileInput (changes)="uploadAvatar()">'
})
export class AvatarUploaderComponent implements OnInit {
@ViewChild('fileInput') fileInputElement: ElementRef;
constructor() { }
ngOnInit() { }
public async uploadAvatar() {
const file: File = this.fileInputElement.nativeElement.files[0];
await this.model.updateAvatar(file);
}
}
This version sends a request to (express) API, but multer
(a library for parsing multipart/form-data
requests) fails to parse the request.
So i guess i either use the HttpClient
incorrectly, or it doesn't support multipart/form-data
requests.
I guess one could send base64 encoded file or use XmlHttpRequest
, but i ask specifically about HttpClient
's ability to do it.