如何将文件和数据从 Angular 上传到 .NET core

Asi*_*idi 3 javascript c# typescript .net-core angular

我正在运行 Angular 9 应用程序,我想实现文件上传行为。在表单中,用户必须输入标题、描述并仅上传一个 .zip 格式的文件,在单击“提交”时,我想通过 http post 调用将表单值与文件一起发送到后端(使用 dotnet)。

文件上传.component.ts

        uploadFile(files) {
            const formData = new FormData();
            const fileToUpload = files[0] as File;
            formData.append('file', fileToUpload, fileToUpload.name);
            const data = {
               title: this.form.value.Title,
               description: this.form.value.Description,
               File: formData
            };
            console.log(data);
            this.http.post('https://localhost:5001/api/idea/add', data).subscribe((response) => {
                console.log(response);
            }});
        }
Run Code Online (Sandbox Code Playgroud)

文件上传.component.html

<input type="file" #file placeholder="Choose file" (change)="uploadFile(file.files)" multiple>
Run Code Online (Sandbox Code Playgroud)

文件控制器.cs

[HttpPost("api/idea/add")]
public async Task<IActionResult> AddIdea([FromBody] IdeaDto ideaDto) { }
Run Code Online (Sandbox Code Playgroud)

后端期望数据采用以下格式

IdeaDto.cs

public class IdeaDto
{
    public IFormFile File { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我在提交数据时遇到以下错误

在此输入图像描述

另外,我执行了 console.log(data) 并获得了 File 值,如下图所示。我不确定这是否是正确的数据

在此输入图像描述

这里有什么问题吗?我真的没有想法了,也许在花了这么多时间之后我需要对此有一个新的想法

pc_*_*der 5

从 api 中的表单获取

[HttpPost("api/idea/add")]
public async Task<IActionResult> AddIdea([FromForm] IdeaDto ideaDto) { }
Run Code Online (Sandbox Code Playgroud)

并在角度填充表单数据中而不是创建对象

uploadFile(files) {
            const formData = new FormData();
            const fileToUpload = files[0] as File;
            formData.append('file', fileToUpload, fileToUpload.name);
            formData.append('title',this.form.value.Title);
            formData.append('description',this.form.value.Description);
            console.log(data);
            this.http.post('https://localhost:5001/api/idea/add', formData ).subscribe((response) => {
                console.log(response);
            }});
        }
Run Code Online (Sandbox Code Playgroud)