在ASP.NET Core Web API中接收文件和其他表单数据(基于边界的请求解析)

你如何形成你应该从请求中接收一个file和一个text值的动作方法的参数?

我试过这个

 public string Post([FromBody]string name, [FromBody]IFormFile imageFile) 

并尝试从Postman打它,但它给了我500 Internal Server Error 。 我也无法调试它,因为它永远不会触及我放置断点的action方法中的第一个语句。

任何想法我们如何解析基于边界的请求并提取文件和其他文本字段? 我是ASP.NET Core的新手。

我有类似的问题,我通过在函数中使用[FromForm]属性和FileUploadModelView解决了这个问题,如下所示:

 [HttpPost] [Route("upload")] public async Task Upload([FromForm] FileUploadViewModel model, [FromForm] string member_code) { var file = model.File; ... } 

我正在使用以下代码来完成此操作,以便解析来自Mailgun的响应 ,其中包含文件和文本值。

请注意,“dashifying”只是将“MessageHeaders”等属性名称变为“message-headers”; 显然你应该使用任何对你的用例有意义的逻辑。

控制器:

 using System; using Microsoft.AspNetCore.Mvc; using NuGet.Protocol.Core.v3; namespace Potato { [Route("api/[controller]")] public class MailgunController : Controller { [HttpPost] public IActionResult Post() { MailgunEmail email = new MailgunEmail(Request); return Ok(email.ToJson()); } } } 

模型:

 using System; using System.Reflection; using System.Collections.Generic; using Microsoft.AspNetCore.Http; namespace Potato { public class MailgunEmail { public IEnumerable Attachments { get; set; } public string Recipient { get; set; } public string Sender { get; set; } public string From { get; set; } public string Subject { get; set; } public string BodyPlain { get; set; } public string StrippedText { get; set; } public string StrippedSignature { get; set; } public string BodyHtml { get; set; } public string StrippedHtml { get; set; } public int? AttachmentCount { get; set; } public int Timestamp { get; set; } public string Token { get; set; } public string Signature { get; set; } public string MessageHeaders { get; set; } public string ContentIdMap { get; set; } public MailgunEmail(HttpRequest request) { var form = request.Form; Attachments = new List(form.Files); foreach (var prop in typeof(MailgunEmail).GetProperties()) { string propName = Dashify(prop.Name); var curVal = form[propName]; if (curVal.Count > 0) { prop.SetValue(this, To(curVal[0], prop.PropertyType), null); } } } private object To(IConvertible obj, Type t) { Type u = Nullable.GetUnderlyingType(t); if (u != null) { return (obj == null) ? GetDefaultValue(t) : Convert.ChangeType(obj, u); } else { return Convert.ChangeType(obj, t); } } private object GetDefaultValue(Type t) { if (t.GetTypeInfo().IsValueType) { return Activator.CreateInstance(t); } return null; } private string Dashify(string source) { string result = ""; var chars = source.ToCharArray(); for (int i = 0; i < chars.Length; ++i) { var c = chars[i]; if (i > 0 && char.IsUpper(c)) { result += '-'; } result += char.ToLower(c); } return result; } } } 

这页帮助了我很多https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads

所以现在我的代码中我有控制器方法:

  public async Task UploadFiles(UploadedFile ups) 

以及模型的类

 public class UploadedFile { public string UploadName { get; set; } public List Files { get; set; } } 

和forms一样

 

我想你正在以适当的JSON格式传输文件和文本。

您应该创建一个新类,其中包含文件和文本作为string类型的属性。 使用属性[FromBody]将新类添加到方法参数中,您将能够根据需要解析图像字符串。

另一种方法是通过访问整个请求内容

 await Request.Content.ReadAsStringAsync(); 

但是,您必须解析整个内容。