IFormFile在ASP.NET Core 2.1中始终返回null

时间:2018-10-16 14:18:42

标签: c# asp.net asp.net-web-api asp.net-core asp.net-core-webapi

Api方法如下所示

    [HttpPost]
    public async Task<BaseListResponse<MediaStorageModel>> MediaBrand(IFormFile file, int brandId)
    {
        var files = new List<IFormFile>();
        files.Add(file);

        var response = await this.Upload(files, "brand", brandId);

        return response;
    }

我的邮递员配置 enter image description here

将我的dotnet核心从2.0升级到2.1不能正常工作,任何人都可以提供帮助。 出了什么问题

11 个答案:

答案 0 :(得分:3)

在发件人表单中添加(名称=“ body”)对我有用

服务器呼叫

[HttpPost]
  [Route("UploadImage")]

public IActionResult UploadImage([FromForm(Name = "body")]IFormFile formData)

客户代码

let formData = new FormData();
formData.append('body', event.target.files[0]);

const config = {
  headers: {
  'content-type': 'multipart/form-data',
  },
}

axios.post(ApiURL,formData, config);

答案 1 :(得分:0)

我找到了一种解决方法,使其起作用:

  

在控制器操作上使用HttpPut代替HttPost

我也为这种行为感到惊讶。如果有人可以解释为什么它可以解决此问题,它将对我有所帮助。

答案 2 :(得分:0)

更改方法参数以采用以下模型并添加[FromForm],它应该可以工作。

public class FileUploadViewModel
{
    public IFormFile File { get; set; }
    public int BrandId { get; set; }
}

public async Task<BaseListResponse<MediaStorageModel>> MediaBrand([FromForm] FileUploadViewModel viewModel)

答案 3 :(得分:0)

我也遇到了同样的问题,我可以通过将'Name'命名参数应用到Form的File字段名称的FromForm属性中来解决此问题。它指定表单中的哪个字段绑定到method参数。更改您的方法签名,如下所示。

[HttpPost("status")]
public async Task<BaseListResponse<MediaStorageModel>> MediaBrand([FromForm(Name ="file")] IFormFile file, int brandId)

答案 4 :(得分:0)

下面的代码应该可以工作

[HttpPost]
public async Task<BaseListResponse<MediaStorageModel>> MediaBrand([FromQuery] int brandId, IFormFile file)
{
    var files = new List<IFormFile>();
    files.Add(file);

    var response = await this.Upload(files, "brand", brandId);

    return response;
}

答案 5 :(得分:0)

在您的表单中使用

enctype =“ multipart / form-data”

答案 6 :(得分:0)

更新[FromForm]属性,不要在Headers中添加参数,而将密钥的名称设置为file和brandId。

我测试了,还可以 Add [FromForm] attribute

Only form-data and key is correct

答案 7 :(得分:0)

Make sure the form is the correct enctype

<form asp-action="Edit" enctype="multipart/form-data">

I also had to change how the Model bind from the generated

public async Task<IActionResult> Edit([Bind("Text,Example")] Example example)

to

public async Task<IActionResult> Edit(Example example)

答案 8 :(得分:0)

如果使用javascript和FormData对象,则需要将每个文件的名称设置为“文件”

this.files.forEach((f) => {
         formData.append("files", f, `${this.path}/${f.name}`);
      }); 

如果您在帖子中使用其他名称,则需要在post方法的属性中进行设置

formData.append("someName", f, `${this.path}/${f.name}`);

 public async Task<IActionResult> Post([FromForm(Name ="someName")] List<IFormFile> files)

不要忘记设置内容类型

'Content-Type': 'multipart/form-data'

答案 9 :(得分:0)

在我的情况下,我有一个使用自定义HttpInterceptor的有角度的6应用程序,该应用程序将内容类型“ application / json”与令牌一起添加到每个Http请求中,然后发送给api。 像下面这样。删除带有“ Content-Type”的行:application/json。没有那个,这里的解决方案都不起作用。到目前为止,.Net Core可以更智能地转换您要发送到api的任何对象,它与您为该对象创建的角度模型匹配。

import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class JwtHttpInterceptor implements HttpInterceptor {
  constructor() {}
  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const token = localStorage.getItem('token');
      let clone: HttpRequest<any>;
      if (token) {
        clone = request.clone({
          setHeaders: {
            Accept: `application/json`,
            'Content-Type': `application/json`,
            Authorization: `Bearer ${token}`
          }
        });

答案 10 :(得分:0)

就我而言,它在网络核心中的工作方式如下

控制器:

[HttpPost]
public IActionResult ReadFormFile([FromForm]IFormFile miCsv)
{


}

请求正文:用作与参数同名

enter image description here

请求标头:用作内容类型: 多部分/表单数据; boundary = xxxxxxxxxxx 边界可以是任何值

enter image description here