У меня есть следующий сервис Angular для загрузки файлов в Amazon S3 с использованием предварительно заданного URL:
import { Injectable } from "@angular/core";
import { HttpClient, HttpRequest, HttpHeaders, HttpEvent, HttpEventType, HttpErrorResponse, HttpParams } from "@angular/common/http";
import { map, tap, last } from 'rxjs/operators';
@Injectable()
export class S3FileUploadService {
constructor(private _http: HttpClient) {
}
upload(url: string, file: File | Blob, progress: (percent: number) => void, result: (msg: StateMessage) => void) {
const req = new HttpRequest('PUT', url, file, {
headers: new HttpHeaders().set("Content-Type", "binary/octet-stream"),
reportProgress: true,
});
this._http.request(req).pipe(
map(event => this._getProgress(event)),
tap(value => progress(value)),
last()
).subscribe(() => {
result({ err: false, msg: "Uploaded" });
}, (err) => {
result({ err: true, msg: this._errorMsg(err, "Not uploaded") });
});
}
private _getProgress(event: HttpEvent<any>) {
switch (event.type) {
case HttpEventType.Sent:
return 0;
case HttpEventType.UploadProgress:
return Math.round(10000 * event.loaded / event.total) / 100;
case HttpEventType.Response:
return 100;
}
}
}
Сервис отлично работает в среде разработки.Однако в производстве по какой-то причине событие прогресса не запускается (обновление происходит, когда загрузка полностью завершена).Я также пытался добавить следующие параметры в объект HttpRequest в соответствии с некоторыми примерами с похожими проблемами через Интернет, но похоже, что это устаревшая вещь, и она ни на что не влияет:
const params = new HttpParams().set("observe", "events");
Что можетпроблема будет вызвана?Может ли это происходить не из Angular build, а из S3, не возвращающего прогресс?