当前位置: 首页 > 知识库问答 >
问题:

在ASP.NET Core Web API中上传文件和JSON

窦伟
2023-03-14

如何使用多部分上载将文件(图像)列表和json数据上载到ASP.NET Core Web API控制器?

我可以成功接收文件列表,上载的文件类型为multipart/form-data,内容类型如下:

public async Task<IActionResult> Upload(IList<IFormFile> files)

当然,我可以使用默认的JSON格式化程序成功接收格式化为对象的HTTP请求主体,如下所示:

public void Post([FromBody]SomeObject value)

但是我如何在一个单独的控制器动作中组合这两个呢?如何上传图像和JSON数据并将它们绑定到对象?

共有1个答案

羊舌承天
2023-03-14

有一个更简单的解决方案,受到安德里乌斯答案的强烈启发。通过使用modelbinderattribute,您不必指定模型或绑定程序提供程序。这节省了大量的代码。您的控制器操作如下所示:

public IActionResult Upload(
    [ModelBinder(BinderType = typeof(JsonModelBinder))] SomeObject value,
    IList<IFormFile> files)
{
    // Use serialized json object 'value'
    // Use uploaded 'files'
}

JsonModelBinder背后的代码(请参阅GitHub或使用NuGet包):

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.ModelBinding;

public class JsonModelBinder : IModelBinder {
    public Task BindModelAsync(ModelBindingContext bindingContext) {
        if (bindingContext == null) {
            throw new ArgumentNullException(nameof(bindingContext));
        }

        // Check the value sent in
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (valueProviderResult != ValueProviderResult.None) {
            bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);

            // Attempt to convert the input value
            var valueAsString = valueProviderResult.FirstValue;
            var result = Newtonsoft.Json.JsonConvert.DeserializeObject(valueAsString, bindingContext.ModelType);
            if (result != null) {
                bindingContext.Result = ModelBindingResult.Success(result);
                return Task.CompletedTask;
            }
        }

        return Task.CompletedTask;
    }
}

下面是上面的控制器操作upload接受的原始http请求的示例。

绑定到IFormFile的文件还需要指定一个FileName,如请求的第二部分所示。content-type不是必需的。

另一个需要注意的是,json部分需要可以反序列化为controller操作中定义的参数类型。因此,在本例中,类型SomeObject应该具有类型为String的属性Key

POST http://localhost:5000/home/upload HTTP/1.1
Host: localhost:5000
Content-Type: multipart/form-data; boundary=12345
Content-Length: 218

--12345
Content-Disposition: form-data; name="value"

{"key": "value"}
--12345
Content-Disposition: form-data; name="files"; filename="file.txt"
Content-Type: text/plain

This is a simple text file
--12345--

可以使用Postman调用操作并测试服务器端代码。这是相当简单的,主要是UI驱动的。创建一个新的请求并在Body-Tab中选择form-data。现在您可以为Reqeust的每个部分在text和file之间进行选择。

 类似资料:
  • 我知道这是一个非常普遍的问题,但我无法在Angular 2中上传文件。我试过了 1) http://valor-software.com/ng2-file-upload/和 2) http://ng2-uploader.com/home ...但是失败了。有人用Angular上传过文件吗?你用了什么方法?如何做到这一点?如果提供任何示例代码或演示链接,我们将不胜感激。

  • 本文向大家介绍PHP实现文件上传和多文件上传,包括了PHP实现文件上传和多文件上传的使用技巧和注意事项,需要的朋友参考一下 在PHP程序开发中,文件上传是一个使用非常普遍的功能,也是PHP程序员的必备技能之一。值得高兴的是,在PHP中实现文件上传功能要比在Java、C#等语言中简单得多。下面我们结合具体的代码实例来详细介绍如何通过PHP实现文件上传和多文件上传功能。 要使用PHP实现文件上传功能,

  • 问题内容: 我正在使用Spring MVC,这是我的方法: 我需要在邮递员和文件中传递会话ID。我怎样才能做到这一点? 问题答案: 在邮递员中,将方法类型设置为 POST 。 然后选择主体->表单数据->输入参数名称(根据您的代码 文件 ) 且右侧旁边值列,会出现 下拉菜单“文本文件” ,选择 文件 。选择您的图像文件并将其发布。 对于其他基于 “文本”的参数 ,您可以像通常使用postman一样

  • 我正在尝试使用多部分实体方法上传文件。但它失败,错误说{“错误”:“文件参数值'无'无效”} 我的代码是: File File = new File(" C:/Users/SST-06/Desktop/new . txt "); 我的实体文件包含所有提到的参数。 -hkYO-pblk 0 uqlxjtvklrbkosxz 7 mye-8 wbvbvanx Content-Disposition:f

  • 问题内容: 我正在尝试在我的GAE应用程序中上传文件。如何使用Go和使用在Google App Engine中上载文件? 问题答案: 我设法通过使用中间返回参数“其他”解决了我的问题。以下这些代码位于上传处理程序中 然后分配相应的formkey 并在我的结构值分配中像这样使用它 并非100%肯定这是正确的做法,但这解决了我的问题,它现在将图像上传到blobstore,并将其他数据和blobkey保

  • 问题内容: 我已经做了很多研究,找到了.NET的上载组件,可以用来上载大文件,具有进度条并可以继续上载大文件。我遇到了一些组件,例如AjaxUploader,SlickUpload和PowUpload,仅举几例。这些选项中的每一个都需要花钱,只有PowUpload可以执行断点续传,但是它使用Java applet来完成。我愿意为一个能够很好地完成这些工作的组件付费,但是如果我自己编写,那将是最好的