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

sha*_*wat 16 c# asp.net .net-core asp.net-core

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

我试过这个

public string Post([FromBody]string name, [FromBody]IFormFile imageFile)
Run Code Online (Sandbox Code Playgroud)

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

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

小智 20

对于任何面临相同问题的人来说,这是一个快速解决方案:

您将使用 ajax 发送以下 formData

let formData: FormData;
formData = new FormData();
formData.append('imageFile', imageFile);
formData.append('name', name);
Run Code Online (Sandbox Code Playgroud)

然后你会在你的控制器中收到它,如下所示:

public string Post(IFormCollection data, IFormFile imageFile)
Run Code Online (Sandbox Code Playgroud)

然后您将像往常一样访问数据:

var name = data["name"];
Run Code Online (Sandbox Code Playgroud)


Ye *_*int 18

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

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

            ...
        }
Run Code Online (Sandbox Code Playgroud)

  • “FileUploadViewModel”到底是什么? (30认同)

Nit*_*pra 12

在 HomeController.cs 中

using Microsoft.AspNetCore.Hosting;
.......
private IHostingEnvironment _environment;

public HomeController(IHostingEnvironment environment)
{
    _environment = environment;
}

[HttpPost]
[ValidateAntiForgeryToken]        
public IActionResult Index(IFormCollection formdata)
{
 var files = HttpContext.Request.Form.Files;
 foreach (var file in files)
 {
     var uploads = Path.Combine(_environment.WebRootPath, "Images");
     if (file.Length > 0)
     {
        string FileName = Guid.NewGuid(); // Give file name
        using (var fileStream = new FileStream(Path.Combine(uploads, FileName), FileMode.Create))
        {
            file.CopyToAsync(fileStream);
        }       
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

在视图中 - Index.cshtml

<form method="post" enctype="multipart/form-data" >
 .....
</form>
Run Code Online (Sandbox Code Playgroud)

你可以试试这个代码。

谢谢!!

  • 看来您正在将“IFormCollection”作为控制器方法的参数,然后完全忽略它并从“HttpContext.Request”中重新拉取它。这样做背后是否有原因,或者只是一个疏忽?:) (6认同)

Dan*_*ore 5

我正在使用以下代码来完成此任务,以便解析Mailgun的响应,该响应包含文件和文本值。

请注意,“破折号”就是这样的属性名称,例如“ 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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

模型:

using System;
using System.Reflection;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;

namespace Potato
{
    public class MailgunEmail
    {
        public IEnumerable<IFormFile> 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<IFormFile>(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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)