HTML
<div class = "row">
<div class = "mb-6">
<label class = "form-label" for = "defaultFile">Upload file</label>
<input type = "file" class = "form-control" id = "defaultFile" (change) = "onChange($event)">
<hr>
<button type = "button" class = "btn btn-outline-theme" (click) = "uploadFile()">Upload</button>
</div>
</div>
Машинопись
import { Component } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-file-upload',
templateUrl: './file-upload.component.html',
styleUrl: './file-upload.component.scss'
})
export class FileUploadComponent {
fileToUpload: File | null = null;
constructor(private http: HttpClient) { }
onChange(event:any) {
this.fileToUpload = event.target.files[0];
}
uploadFile() {
if (!this.fileToUpload) {
alert('No file selected.');
return;
}
const formData: FormData = new FormData();
formData.append('file', this.fileToUpload, this.fileToUpload.name);
return this.http.post("<ENDPOINT TO UPLOAD THE FILE>", formData).subscribe(
(response) => {
console.info(response);
},
(error) => {
console.error(error);
}
);
}
}
Загрузка файла работает нормально. Не уверен, какой «угловой» способ очистить текстовое поле. (Чтобы сделать этот пост простым, я переместил код, вызывающий API, в компонент и удалил всю обработку ошибок и т. д., чтобы уловить суть.)





Для простоты мы можем использовать ссылочную переменную шаблона #input в html, чтобы передать ссылку на элемент в функцию и очистить значение, используя input.value = null
Для простоты я удалил вызовы API и заменил их на of(true) для макетирования и вызова API!
import { HttpClient } from '@angular/common/http';
import { Component } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import { of } from 'rxjs';
import 'zone.js';
@Component({
selector: 'app-root',
standalone: true,
template: `
<div class = "row">
<div class = "mb-6">
<label class = "form-label" for = "defaultFile">Upload file</label>
<input type = "file" class = "form-control" id = "defaultFile" (change) = "onChange($event)" #input>
<hr>
<button type = "button" class = "btn btn-outline-theme" (click) = "uploadFile(input)">Upload</button>
</div>
</div>
`,
})
export class App {
fileToUpload: File | null = null;
constructor() {}
onChange(event: any) {
this.fileToUpload = event.target.files[0];
}
uploadFile(input: any) {
if (!this.fileToUpload) {
alert('No file selected.');
return;
}
const formData: FormData = new FormData();
formData.append('file', this.fileToUpload, this.fileToUpload.name);
return of(true).subscribe(
(response: any) => {
console.info(response);
input.value = null; // <- changed here!
},
(error: any) => {
console.error(error);
}
);
}
}
bootstrapApplication(App);
@Sandeep Надеюсь, вы имеете в виду, что HTML-код будет находиться в отдельном файле и на него можно будет ссылаться с помощью templateUrl, да, это будет работать!
Большое спасибо, Нарен. Ваш ответ был очень полезен, также большое спасибо за усилия, которые вы приложили для создания демо!
если вы используете реактивные формы, вы можете использовать этот фрагмент кода:
import { Component } from '@angular/core';
import { FormControl, ReactiveFormsModule } from '@angular/forms';
@Component({
standalone: true,
imports: [ReactiveFormsModule],
template: `
<div>
<input type = "file" name = "test" id = "test" [formControl] = "test" />
<button type = "submit" (click) = "onSubmit()">submit</button>
</div>
`,
})
export class TestComponent {
test: FormControl = new FormControl();
onSubmit() {
// submit logic ....
this.test.reset();
}
}
Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.
Большое спасибо, Нарен. Будет ли ссылка на текстовое поле работать, если HTML не будет встроенным?