我目前有一个包含大量字段的表单,其中一个是文件上载字段。它们都构成在我的构造函数中声明的FormGroup
的一部分。现在我可以使用this.control.value
访问所有文本控件,但文件控件除外。当我尝试访问文件的表单控件的value
时,我得到的只是C:/fakepath/image.png
。
是否可以访问实际文件数据,以便将其上传到我的API?
我的FormControl
声明:
/**
* Category of the product
*/
public category = new FormControl('', [
Validators.required
]);
/**
* Name of the product
*/
public name = new FormControl('', [
Validators.required,
Validators.minLength(3)
]);
/**
* Description of the product
*/
public description = new FormControl('', [
Validators.required
]);
/**
* Price of the product
*/
public price = new FormControl('', [
Validators.required
]);
/**
* Image of the product
*/
public image = new FormControl('', [
Validators.required
]);
我的页面/组件的构造函数:
constructor(private api: ApiService,
private formBuilder: FormBuilder) {
this.productForm = formBuilder.group({
category: this.category,
name: this.name,
description: this.description,
price: this.price,
image: this.image
});
}
我目前如何尝试访问文件
public async createProduct(): Promise<any> {
console.log(this.image.value);
}
答案 0 :(得分:3)
步骤1:HTML模板(file-upload.component.html)
定义类型文件的简单输入标签。在(更改)事件中添加一个用于处理选择文件的功能。
<div class="form-group">
<label for="file">Choose File</label>
<input type="file"
id="file"
(change)="handleFileInput($event.target.files)">
</div>
第2步:使用TypeScript(在组件文件中)上传处理
为所选文件定义默认变量。
fileToUpload: File = null;
创建在文件输入标签的(更改)事件中使用的功能:
handleFileInput(files: FileList) {
this.fileToUpload = files.item(0);
}
第3步:文件上传服务
通过POST方法上传文件时,您应该使用FormData,因为这样可以将文件添加到http请求中。
postFile(fileToUpload: File): Observable<boolean> {
const endpoint = 'your-destination-url';
const formData: FormData = new FormData();
// Append image file to formdata as a seperate property
formData.append('fileKey', fileToUpload, fileToUpload.name);
// Append reactive form data too in a seperate property
formData.append('productForm', JSON.stringify(this.productForm, null, 4));
return this.httpClient
.post(endpoint, formData, { headers: yourHeadersConfig })
.map(() => { return true; })
.catch((e) => this.handleError(e));
}
答案 1 :(得分:0)
是否可以访问实际文件数据,以便将其上传到我的API?
您可以通过以下方式访问它:
// template
<input
type="file" (change)="onFileChanged($event)"
>
// component
onFileChanged(event) {
// this.image will be updated each time the file
// in input will be changed
this.image = event.target.files[0];
console.log(this.image);
}
createProduct(): Promise<Product> {
console.log(this.image);
const formData = new FormData();
formData.append(
'image',
this.image
);
// add other fields to formData:
formData.append("name", this.productForm.controls['name'].value);
formData.append("description", this.productForm.controls['description'].value);
const url = 'urlToApi';
return this.http.post(url, formData)
.toPromise()
.then(response => {
return response;
})
.catch(err => console.log(err));
}