Ответ лежит в реализации HttpClient
. Все запросы, созданные с помощью метода HttpClient.post
, по умолчанию для свойства observe
равны body
. Подробнее см. этот метод HttpClient.post . Это означает следующее: даже если вы успешно установили reportProgress
в true
, полученная в результате наблюдаемая будет наблюдать тело запроса вместо HttpEvents
. С Документы (выделено мое):
Значение наблюдения определяет тип возврата request (), основываясь на том, что потребитель заинтересован в наблюдении. Значение события вернет Observable<HttpEvent>
, представляющий необработанный поток HttpEvent , включая события прогресса по умолчанию. Значение response будет возвращать Observable<HttpResponse<T>>
, где параметр T HttpResponse зависит от responseType и любого необязательного параметра типа. Значение body вернет Observable<T>
с тем же типом тела T .
В документации также отмечается, что если вы передадите экземпляр HttpRequest
в request
, он вернет наблюдаемый поток HttpEvent
по умолчанию:
Этот метод может быть вызван одним из двух способов. Либо экземпляр HttpRequest можно передать непосредственно в качестве единственного параметра, либо метод можно передать в качестве первого параметра, строковый URL-адрес в качестве второго и хэш параметров в качестве третьего.
Если объект HttpRequest передается напрямую, возвращается Observable необработанного потока HttpEvent.
Итак, самый простой способ наблюдать поток HttpEvent
- это передать объект HttpRequest
напрямую, как отмечено:
sendImageFile(subUri: string, id: number, fileToUpload: File): Observable<any> {
const formData: FormData = new FormData();
formData.append('file', fileToUpload, fileToUpload.name);
formData.append('photoalbum_id', id.toString());
// ... some other .append()
const customHeaders = new HttpHeaders({
'Authorization': 'Bearer' + localStorage.getItem('token'),
'Accepted-Encoding': 'application/json'
});
const customOptions = {
headers: customHeaders,
reportProgress: true,
};
const req = new HttpRequest('POST', this.url, formData, customOptions);
// Call HttpClient.request with an HttpRequest as only param to get an observable of HttpEvents
return this.http.request(req)
.pipe(
map((event: HttpEvent<any>) => this.getEventMessage(event)),
catchError(this.handleError));
}
private getEventMessage(event: HttpEvent<any>) {
// We are now getting events and can do whatever we want with them!
console.log(event);
}
Я протестировал этот переработанный код в локальном репозитории, и он работал просто отлично.