Я новичок в Angular, поэтому прошу прощения за любые грубые ошибки, если вы их видите. Не стесняйтесь указывать мне в правильном направлении:)
У меня есть служба Angular, которая вызывает метод контроллера. Раньше его так называли, и он возвращал объект, содержащий данные, используемые для отображения изображения в браузере
return (this.http.post(`/api/vehicles/${vehicleId}/photos`, formData)
.map(res => res);
При загрузке изображения меня попросили добавить индикатор выполнения, поэтому я добавил опцию reportProgress в вызов http. У моего сервиса теперь есть свойство uploadProgress, которое я могу привязать к индикатору выполнения и отображать ход загрузки.
@Injectable()
export class PhotoService {
uploadProgress: any;
...
upload(vehicleId, photo) {
let formData = new FormData();
formData.append('file', photo);
const uploadReq = new HttpRequest('POST', `/api/vehicles/${vehicleId}/photos`, formData, {
reportProgress: true
});
return (this.http.request(uploadReq)
.map((event) => {
if (event.type === HttpEventType.UploadProgress) {
this.uploadProgress = this.createProgress(event);
} else if (event.type === HttpEventType.Response) {
return event.body;
}
}));
}
private createProgress(event) {
return {
total: event.total,
percentage: Math.round(event.loaded / event.total * 100)
};
}
Метод в моей форме теперь выглядит следующим образом
uploadPhoto() {
var nElem: HTMLInputElement = this.fileInput.nativeElement;
var file = nElem.files[0];
nElem.value = '';
this.photoSvc.upload(this.vehicleId, file)
.subscribe(photo => {
this.progress = this.photoSvc.uploadProgress;
console.log('this.progress: ', this.progress);
if (photo !== undefined) {
console.log('Photo result:', photo);
this.photos.push(photo);
}
},
err => {
this.toasty.error({
title: 'Error',
msg: err.text(),
theme: 'bootstrap',
showClose: true,
timeout: 5000
});
},
() => { this.progress = null; });
}
Блок подписки срабатывает несколько раз, и я использую его для обновления переменной this.progress, связанной с индикатором выполнения. Это работает, я не уверен, что это правильный способ сделать это, но это работает. Если это не правильный путь, не стесняйтесь разрабатывать.
Проблема, с которой я теперь не могу разобраться, заключается в том, что если выполняются мои крайние случаи в контроллере (размер файла, тип файла, пустой файл и т. Д.), Они возвращают ошибки BadRequest, как в примерах ниже, но мой блок err на подписка не перехватывает их, поэтому всплывающее сообщение не отображается. Вместо этого он обращается к моему глобальному обработчику ошибок. Я хотел, чтобы в этой загрузке отображались более значимые сообщения вместо общего тост-сообщения, которое теперь выдает система.
if (file == null) { return BadRequest("Null file"); }
if (file.Length == 0) { return BadRequest("Empty file"); }
Любая помощь в том, что здесь происходит, приветствуется. Заранее спасибо!