文件上传控件反应形式

时间:2019-03-04 11:58:40

标签: javascript angular

问题

我目前有一个包含大量字段的表单,其中一个是文件上载字段。它们都构成在我的构造函数中声明的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);
}

2 个答案:

答案 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));
}