.NET Core 2中ReadAsMultipartAsync等效实现及代码迁移问题
ASP.NET Core 2.0 读取MimeMultipart请求体的解决方案
我刚好做过.NET Framework到ASP.NET Core的迁移,这个问题我熟!你提到的Request.Content在Core里确实被移除了,不过有两种常用的方式来处理multipart请求,而且大部分情况下不需要修改前端,下面详细说:
一、推荐方式:使用IFormFile(无需修改前端)
ASP.NET Core专门封装了IFormFile来处理上传文件,只要你的前端原本是用multipart/form-data格式提交的(和.NET 4.5时代一样),完全不需要改前端代码,直接在Action里接收参数即可:
[HttpPut] [Route("api/files/{id}")] public async Task<Person> Put(int id, [FromForm] IFormFile file) { // 直接获取文件流 using (var fileStream = file.OpenReadStream()) { return _personService.UpdatePerson(id, fileStream); } }
如果前端可能上传多个文件,也可以接收IEnumerable<IFormFile>:
public async Task<Person> Put(int id, [FromForm] IEnumerable<IFormFile> files) { var firstFile = files.FirstOrDefault(); if (firstFile == null) { // 处理无文件的情况 return ...; } using (var fileStream = firstFile.OpenReadStream()) { return _personService.UpdatePerson(id, fileStream); } }
这种方式是Core官方推荐的,代码简洁,框架帮你处理了multipart的解析、边界值处理等细节,非常省心。
二、手动解析Request.Body(无需修改前端)
如果你不想用IFormFile,想自己手动解析multipart请求体,也可以用MultipartReader来实现,和原来的ReadAsMultipartAsync逻辑类似:
using Microsoft.AspNetCore.WebUtilities; using Microsoft.Net.Http.Headers; [HttpPut] [Route("api/files/{id}")] public async Task<Person> Put(int id) { // 确保请求是multipart类型 if (!Request.ContentType.StartsWith("multipart/form-data", StringComparison.OrdinalIgnoreCase)) { throw new BadHttpRequestException("请求不是multipart/form-data格式"); } // 获取multipart边界值 var boundary = MediaTypeHeaderValue.Parse(Request.ContentType).Parameters .First(p => p.Name.Equals("boundary", StringComparison.OrdinalIgnoreCase)).Value; var reader = new MultipartReader(boundary, Request.Body); // 读取第一个文件部分 var section = await reader.ReadNextSectionAsync(); if (section != null) { // 获取文件流 using (var fileStream = new MemoryStream()) { await section.Body.CopyToAsync(fileStream); fileStream.Position = 0; // 重置流的位置 return _personService.UpdatePerson(id, fileStream); } } // 处理无文件的情况 return ...; }
注意:这种方式需要自己处理边界值验证、部分读取等逻辑,适合有特殊定制需求的场景,一般情况下还是推荐用IFormFile。
额外注意事项
- ASP.NET Core 2.0默认已经支持
IFormFile,只要你的Startup.cs里配置了services.AddMvc()(默认模板都会加)就没问题。 - 如果上传大文件,需要在Startup.cs里配置请求大小限制:
services.Configure<FormOptions>(options => { options.MultipartBodyLengthLimit = 10 * 1024 * 1024; // 10MB,根据需求调整 });
内容的提问来源于stack exchange,提问作者Moddaman
相关产品推荐
相关产品推荐

