Télécharger l'image avec HttpClient

Problème

J'ai essayer de télécharger une image avec angulaire du HttpClient API Content-Type: multipart/form-data (angulaire v4+). Est-il pris en charge? Comment faire?

Le téléchargement fonctionne avec XMLHttpRequest lors de l'utilisation de module comme ng2-fantaisie-image-uploader. Je préfère utiliser une méthode personnalisée avec HttpClient qui je pourrait mettre dans un service http ensemble avec d'autres méthodes pour accéder à l'API.

Voici ce que j'ai essayé jusqu'à présent:

modèle.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.composante.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);
  }

}

Cette version envoie une demande (express) de l'API, mais multer (une bibliothèque pour l'analyse multipart/form-data demandes) ne parvient pas à analyser la demande.

Donc je suppose que je utiliser le HttpClient de manière incorrecte, ou qu'il ne prend pas en charge multipart/form-data demandes.

Je pense qu'on pourrait envoyer encodées en base64 fichier ou utiliser XmlHttpRequest, mais je demande spécifiquement sur HttpClientla capacité de le faire.

OriginalL'auteur mrkvon | 2017-09-05