asp.net核心Web API文件上传和“表单数据”多个参数传递给方法

Din*_*ghe 7 asp.net-mvc azure .net-core asp.net-core

我创建了一个以文件为参数的端点:

    [HttpPost("[action]")]
    [Consumes("multipart/form-data")]
    public ActionResult UploadImage(IFormFile  Files, string param)
    {

        long size = Files.Length;            
        var tempPath = Path.GetTempFileName();
        string file_Extension = Path.GetExtension(Files.FileName);                   
        var isValidFile = FileValidation.FileUploadValidation(Files);
        if (isValidFile.data)
        {
            string filename = Guid.NewGuid() + "" + file_Extension;
            return null;

        }
        else
        {
            return null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我无法检索文件而没有问题。如何在同一方法中添加更多文本参数?

调试视图参数参数为空

邮递员电话

Din*_*ghe 14

[HttpPost("[action]")]
[Consumes("multipart/form-data")]
public IActionResult UploadImage([FromForm] FileInputModel Files)
{

    return Ok();
}

public class FileInputModel 
{
    public IFormFile File { get; set; }
    public string Param { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

需要[FromForm]在我添加[FromForm]代码后在参数模型之前添加 才能完美运行。

  • 实际上我需要发送 FileInputModel 列表。需要明确的是,每个文件都有自己独特的参数。当我尝试发送“List<FileInputModel> model”操作时,动作堆栈,我无法得到任何响应。你有什么主意吗? (2认同)

小智 7

它可以100%工作。经过测试。请执行以下步骤:

您应该为模型创建一个自定义类,如下所示:

public class FileInputModel
{
    public string Name { get; set; }
    public IFormFile FileToUpload { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和形式像

<form method="post" enctype="multipart/form-data" asp-controller="Home" asp-action="UploadFileViaModel" >
    <input name="Name" class="form-control" />
    <input name="FileToUpload" type="file" class="form-control" />
    <input type="submit" value="Create" class="btn btn-default" />
</form>
Run Code Online (Sandbox Code Playgroud)

和类似的控制器方法

[HttpPost]
public async Task<IActionResult> UploadFileViaModel([FromForm] FileInputModel model)
{
    if (model == null || model.FileToUpload == null || model.FileToUpload.Length == 0)
        return Content("file not selected");

    var path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", model.FileToUpload.FileName);

    using (var stream = new FileStream(path, FileMode.Create))
    {
        await model.FileToUpload.CopyToAsync(stream);
    }

    return RedirectToAction("Files");
}
Run Code Online (Sandbox Code Playgroud)


Ant*_*hik 5

我使用以下代码进行了测试并且它有效:

public class TestController : Controller
{
    [HttpPost("[controller]/[action]")]
    public IActionResult Upload(Model model)
    {
        return Ok();
    }

    public class Model
    {
        public IFormFile File { get; set; }
        public string Param { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您需要使用模型。

下面是具有相同属性的邮递员屏幕截图。

下面是邮递员截图

更新

将模型更改为:

public class Model
{
    public List<IFormFile> Files { get; set; }
    public string Param { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

邮递员截图: 多部分表单内容

更新2

内容类型标头是multipart/form-data

这是它工作的屏幕截图:

工作代码