首页 > 解决方案 > 尝试将文件从 Angular 6 发布到 ASP.NET Core Web Api 时出错

问题描述

我正在尝试使用 Angular 6 应用程序中的 multipart/form-data 向 ASP.NET Core 中的 REST 服务发出 POST 请求,但出现错误 500。我尝试了太多解决方案,但没有任何效果。我尝试在 Postman 上执行请求并遇到同样的问题,但我尝试了其他名为 ARC(高级 REST 客户端)的软件,并且工作起来很吸引人,我不知道为什么。

在服务器端,我得到 InvalidDataException: Missing content-type boundary。在我的项目中,我也在使用 swagger

这是我的代码

角度请求:

public uploadPlanilha(planilha: File, idLote: number): Observable<Array<RequisicaoComposicao>>{
    let formData = new FormData();

    formData.append('arquivo', planilha, planilha.name);
    formData.append('idLote', idLote.toString());

    let httpHeaders = new HttpHeaders();
    httpHeaders = httpHeaders.set("Content-Type", "multipart/form-data");

    return this.httpClient.post<Array<RequisicaoComposicao>>(`${this.API_URL}requisicoes/upload`, formData, {
      headers: httpHeaders
    });
  }

Web Api 中的控制器方法

[HttpPost]
        [Route("upload")]
        [Consumes("multipart/form-data")]
        [DisableRequestSizeLimit]
        public ActionResult<List<RequisicaoComposicao>> PostPlanilhaRequisicoes([FromForm]ArquivoDto arquivoDto)
        {
            try
            {
                using (Stream arquivoPlanilha = arquivoDto.Arquivo.OpenReadStream())
                {
                    List<RequisicaoComposicao> requisicaoComposicoes = _composicaoGestor.Inserir(arquivoPlanilha, int.Parse(arquivoDto.IdLote));
                    return Ok(requisicaoComposicoes);
                }
            }
            catch (Exception)
            {
                return StatusCode(StatusCodes.Status500InternalServerError);
            }
        }

ArquivoDto 类

public class ArquivoDto
        {
            public IFormFile Arquivo { get; set; }
            public string IdLote { get; set; }
        }

标签: c#angularasp.net-coreasp.net-core-webapi

解决方案


删除[FromForm]不需要的标签。

在这条线上: formData.append('arquivo', planilha, planilha.name);

将其更改为formData.append('arquivo', planilha);

我从未使用过它,因此我认为您不需要[Consumes("multipart/form-data")]属性 ether。(除非你使用像 swagger 这样的东西,并且你想告诉它这个方法消耗了什么然后保留它)

我也会删除这条线httpHeaders = httpHeaders.set("Accept", "multipart/form-data");


推荐阅读