【问题标题】:How to upload file along with data from Angular to .NET core如何将文件与数据一起从 Angular 上传到 .NET 核心
【发布时间】:2021-02-26 22:17:10
【问题描述】:

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

file-upload.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);
            }});
        }

file-upload.component.html

<input type="file" #file placeholder="Choose file" (change)="uploadFile(file.files)" multiple>

FileController.cs

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

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

IdeaDto.cs

public class IdeaDto
{
    public IFormFile File { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
}

我在提交数据时遇到错误

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

这里有什么问题?我真的没有想法,也许在花了这么多时间后我需要重新思考一下

【问题讨论】:

    标签: javascript c# angular typescript .net-core


    【解决方案1】:

    从 api 中获取表单

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

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

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

    【讨论】:

      【解决方案2】:

      当您发布像文件这样的二进制数据时,它们必须作为多部分表单数据发布,请使用下面的标题

      Content-Type: multipart/form-data;

      在模型中,您应该以文件而不是自定义接口的形式接收数据 (IFormFile)

      【讨论】:

        猜你喜欢
        • 2019-08-26
        • 2020-10-26
        • 2020-11-01
        • 2021-12-24
        • 1970-01-01
        • 2019-08-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-02
        相关资源
        最近更新 更多