首页 > 解决方案 > 将文件发布到控制器 - IFormFiles 始终为空

问题描述

我正在尝试发出一个 POST 请求,将文件发送到具有以下定义的控制器方法

public async Task<ActionResult> PostUploadFilesAsync([BindRequired, FromForm] IEnumerable<IFormFile> files) 

但“文件”在收到请求时始终为空。

我尝试了几种不同的发布方式,这是我目前构建请求的尝试。我发送的文件已上传到我自己的控制器,此时看起来还不错。

  var client = new HttpClient();
  var content = new MultipartFormDataContent();

  MemoryStream ms = new MemoryStream();
  await Request.Form.Files[0].CopyToAsync(ms);
  content.Add(new StreamContent(ms));
  var address = <the-address>;
  var result = client.PostAsync(address, content);

我无法弄清楚为什么没有收到文件。谢谢

标签: c#asp.net-core

解决方案


我发现您发布的代码有两个问题:

  1. 调用实例AddMultipartFormDataContent,您需要同时指定namefilenamename参数必须与正在使用的参数匹配PostUploadFilesAsync

    content.Add(new StreamContent(ms), "files", "file1");
    

    您可以多次执行此操作,以添加多个文件。例如:

    content.Add(new StreamContent(ms1), "files", "file1");
    content.Add(new StreamContent(ms2), "files", "file2");
    
  2. 将 的内容复制Request.Form.Files[0]MemoryStream, 后ms,还必须重置流的位置。否则,发送到服务器的内容将为空,因为它将从流的当前位置开始,即在末尾。这是在添加内容之前重置位置的示例:

    ms.Position = 0;
    content.Add(new StreamContent(ms));
    

推荐阅读