【问题标题】:Multipart/form-data file upload in asp.net core web api在 asp.net 核心 web api 中上传多部分/表单数据文件
【发布时间】:2017-09-26 05:39:38
【问题描述】:

如何在asp.net core web api中上传Multipart-form-data文件?是否可以在一个 POST 中同时 POST JSON 和图像?

【问题讨论】:

    标签: asp.net-core-webapi


    【解决方案1】:

    更新-.net core 2.0 +

    使用 .net core,您可以利用新的IFormFile 界面在同一个帖子中上传图片和属性。例如:

    [HttpPost("content/upload-image")]
    public async Task<IActionResult> UploadImage(MyFile upload)
    

    MyFile 类可能如下所示:

    public class MyFile
    {
        public string userId { get; set; }        
        public IFormFile File { get; set; }
        // Other properties
    }
    

    您可以通过以下方式访问propertiesfile

    var file = upload.File // This is the IFormFile file
    var param = upload.userId // param
    

    要将文件持久化/保存到磁盘,您可以执行以下操作:

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

    .NET 框架

    是的。根据您使用的客户端 Framework,您可以为 Content Type-Multipart 配置您的 Web API,然后执行以下操作:

    [HttpPost]
    [Route("content/upload-image")]       
    public async Task<HttpResponseMessage> Post()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }           
        // enter code here
    }
    

    定义和设置您的图像将被保存的目录。

    var root = HttpContext.Current.Server.MapPath("~/Content/Images/");
    if (!Directory.Exists(root))
    {
        Directory.CreateDirectory(root);
    }  
    

    设置 StreamProvider 并尝试获取 model 数据,即您提到的 JSON

    var streamProvider = new MultipartFormDataStreamProvider(root);
    var result =
        await Request.Content.ReadAsMultipartAsync(streamProvider);
    if (result.FormData["model"] == null)
    {
        throw new HttpResponseException(HttpStatusCode.BadRequest);
    }
    

    现在访问请求中的文件。

    try
    {
        // Deserialize model data to your own DTO
        var model = result.FormData["model"];
        var formDto = JsonConvert
            .DeserializeObject<MyDto>(model, new IsoDateTimeConverter());
        var files = result.FileData.ToList();                
        if (files != null)
        {
            foreach (var file in files)
            {
                // Do anything with the file(s)
            }
        }
    }
    

    【讨论】:

    • 谢谢。将尝试解决方案。
    • 我无法在 .net core 2.0 预览版中访问 Request.Content。有什么想法吗?
    • IFormFile 接口是在 .net core 中引入的。在这里看看:docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads.
    • 感谢您的回复。据我所知,IFormFile 接口适用于 MVC 应用程序,而不适用于 WebApi。
    • 我认为你还需要 [FromForm] 属性
    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 2017-01-30
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    相关资源
    最近更新 更多