【问题标题】:Angular 8 - Upload file along with form and send to serverAngular 8 - 将文件与表单一起上传并发送到服务器
【发布时间】:2020-02-18 09:33:25
【问题描述】:

我在 Angular 8 中有一个反应式表单。在提交表单时,我需要将值与上传的文件一起发布到 API。但我不太确定如何将文件与值一起发布。

<form [formGroup]="detailsForm" (ngSubmit)="onSubmit()">
    <div>
        <label for="desc">Description</label>
        <input type="text" id="desc" formControlName="desc"/>
    </div>
    <div>
        <label for="summary">Summary</label>
        <textarea id="summary" formControlName="summary"></textarea>
    </div>
    <div formGroupName="contact">
        <div>
            <label for="name">Name</label>
            <input type="text" id="name" required formControlName="name"/>
        </div>
        <div>
            <label for="email">Email</label>
            <input type="email" id="email" formControlName="email"/>
        </div>
    </div>
    <div>
        <label for="file">Upload File</label>
        <input type="file" id="file" formControlName="file">
    </div>
    <button type="submit">Submit</button>
</form>

在组件中

constructor(public httpService: HttpRequestService) { }

onSubmit() {
   this.httpService.postData(this.detailsForm.value).then(
      (result) => {
        this.jsonResponse = result;
      },
      (err) => {
        this.errorResponse = 'Sorry, there was an error processing your request!'; 
      }
   )
}

服务中

postData(detailsData) {
    const headers = new HttpHeaders(
      { 'Content-Type': 'multipart/form-data' }
    );
    return new Promise((resolve, reject) =>{
      this.http.post('http://localhost:3000/postData', detailsData, { headers: headers })
      .subscribe(res => resolve(res), err => reject(err))
    });
}

在后端,仅用于测试目的

const express = require("express");
const bodyParser = require('body-parser');
const cors = require('cors');

const app = express();
app.use(cors());
// Configuring body parser middleware
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.listen(3000, () => {
 console.log("Server running on port 3000");
});

app.post("/postData", (req,res) => {
    console.log(req.body);
});

所有值都被记录下来,但对于文件,我只获取路径值。如何获取文件的内容(我需要上传和发送 Excel 文件)。

【问题讨论】:

标签: angular


【解决方案1】:

当我想将文件发送到后端时,我通常会这样做。

Html element

        <div class="form-group">
          <input style="color:transparent;" onchange="this.style.color = 'black';" type="file"
            (change)="onImageChange($event)" #bannerPhoto />
        </div>

component.ts

onImageChange(event) {
const reader = new FileReader();
if (event.target.files && event.target.files.length) {
  const [file] = event.target.files;
  reader.readAsDataURL(file);
  reader.onload = () => {
    this.addEventForm.patchValue({
      banner: reader.result
    });
    this.formData.append('banner', event.target.files[0], event.target.files[0].name);
  };
}}

这是formDataaddEventForm 变量的类型:

  addEventForm: FormGroup;
  formData: FormData;

我如何调用 API:

    this.eventService.add(this.formData)
        .subscribe(/*Your code goes here*/)

【讨论】:

  • 我是 Angular 的新手。我们在这里使用 FileReader 来读取文件并在 FormGroup 上修补值。我们为什么要这样做?追加到formData还不够吗。
  • 我收到一个错误,this.addEventForm.patchValue({ banner: reader.result });错误是 ERROR DOMException: Failed to set the 'value' property on 'HTMLInputElement': This input element接受一个文件名,它只能以编程方式设置为空字符串。如果我的表单中只有文件,它可以正常工作。但是当我向表单添加字段时,我收到了错误。
  • 抱歉回复晚了,至于将其附加到FormGroup 我之所以附加它是因为我需要它来做另一件事。至于错误,请检查这个答案:stackoverflow.com/a/41938495/9401556
  • @NHG 如果您使用了我的答案并且对您有所帮助,请您将其标记为答案。如果没有,那么它是你的选择。谢谢。
猜你喜欢
  • 2014-01-22
  • 2020-03-02
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 2016-08-26
相关资源
最近更新 更多