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

2023-11-21

如何使用分段上传将文件(图像)和 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 数据并将它们绑定到我的对象?


简单,代码少,无包装模型

有一个更简单的解决方案,深受启发安德烈斯的回答。通过使用 这ModelBinderAttribute您不必指定模型或活页夹提供者。这节省了大量代码。您的控制器操作将如下所示:

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

执行

代码隐藏JsonModelBinder (see GitHub or use 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;
    }
}

请求示例

以下是控制器操作接受的原始 http 请求的示例Upload above.

A multipart/form-data请求被分成多个部分,每个部分由指定的分隔boundary=12345。每个部分都有一个指定的名称Content-Disposition-标题。默认使用这些名称ASP.Net-Core知道哪个部分绑定到控制器操作中的哪个参数。

绑定的文件IFormFile另外需要指定一个filename如请求的第二部分所示。Content-Type不需要。

另一件需要注意的事情是,json 部分需要反序列化为控制器操作中定义的参数类型。所以在这种情况下类型SomeObject应该有财产key类型的string.

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 驱动的。创建一个新请求并选择表单数据 in the Body-标签。现在您可以选择text and file对于请求的每个部分。

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ASP.NET Core Web API 中上传文件和 JSON 的相关文章

  • copy_from_user() 错误:目标大小太小

    我正在为内核模块编写 ioctl 处理程序 我想从用户空间复制数据 当我编译禁用优化的代码时 O0 gflags 编译器返回以下错误 include linux thread info h 136 17 error call to bad
  • 如何使用T4从一个模板同时生成两个文件?

    我遇到的情况是 我需要生成两个 CSharp 代码文件 它们的代码几乎相同 但方法的输入和输出类型的命名空间不同 事实上 每个文件都针对特定国家 地区 并且类型来自特定国家 地区的 WSDL 我正在围绕服务编写一些包装器 逻辑完全相同 但从
  • 如何从经过身份验证的 SecurityToken 中获取声明

    我将令牌作为字符串传递到 SOAP 服务中 并验证了该令牌是否有效 我现在有一个 SecurityToken 在调试模式下我可以看到所有声明 特别是我想传递到另一个方法的 userId 声明 我似乎不知道如何获得这些索赔 现在 我解码了令牌
  • 从结构调用 C++ 成员函数指针

    我找到了有关调用 C 成员函数指针和调用结构中的指针的信息 但我需要调用结构内部存在的成员函数指针 但我无法获得正确的语法 我在类 MyClass 的方法中有以下代码片段 void MyClass run struct int MyClas
  • 我担心我添加了太多接口

    我正在构建我的领域模型并继续重构它 正如我所做的那样 我发现我喜欢接口 因为它允许我根据接口为具体类型创建可重用的方法 控制器 视图 但是 我发现每次向域实体之一添加新属性时 我都会创建一个接口 例如 我有一个会员状态从抽象继承的对象Ent
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • Windows Phone 7 - ScrollViewer 值已更改

    我一直在寻找解决方案 但无法找到正确的解决方案 我的网格宽度为 960 并且有ScrollViewer在里面 现在我想知道滚动时滚动的值 水平偏移 我找到的所有解决方案都是针对 wpf silverlight 的 它对我不起作用 Edit
  • C# 结构默认值

    我有一个方法 它接受一个包含许多具有基本数据类型的字段的结构 我想传递大部分默认值 但需要进行一些调整 但我了解结构声明中的基本字段不能包含默认值声明 例如struct S int a 42 现在是这样的 OptionsStruct opt
  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • 重载算术运算符

    赋值运算符可以声明为 T 运算符 const t 在类中 但不能以这种方式定义算术运算符 它必须是友元函数 我不明白为什么 你能解释一下吗 算术运算符不必须是友元 那么你可以这样定义 MyClass MyClass operator con
  • 注入包含接口的所有已注册实现的 Enumerable

    给出以下接口 public interface IMyProcessor void Process 我希望能够注册多个实现 并让我的 DI 容器将它们的可枚举注入到这样的类中 public class MyProcessorLibrary
  • 如何从 Powerpoint 2010 导出电影?

    如何使用 MS Office PIA 主互操作程序集 或其他方式以编程方式将嵌入视频从 powerpoint 2010 导出到外部文件 在演示文稿中嵌入视频是 Powerpoint 2010 中的一项新功能 我找不到解决方案 PPTX 文件
  • main.cpp 是必需的吗?

    我试图编译一个程序cmake 我最终删除了我的main cpp文件 我刚刚将其复合到另一个包含我的项目名称的文件中 即 我刚刚将主函数剪切并粘贴到该文件中 问题是我有一个main cpp未发现错误 不确定是否在C 一个名为main cpp是
  • C++网络序列化[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种将 C 数据包序列化为网络流的解决方案 我在这里看到很多帖子提到人们 ACE 谷歌协议缓
  • 查找数组中的多个索引

    假设我有一个像这样的数组 string fruits watermelon apple apple kiwi pear banana 是否有一个内置函数可以让我查询 apple 的所有索引 例如 fruits FindAllIndex ap
  • 如何防止 Lotus Notes 用户转发或复制通过 System.Net.Mail 发送的邮件?

    我想使用 SMTP 客户端 uiing microsft net 以 C 作为编程语言发送电子邮件 但是对于通过SMTP客户端发送的电子邮件 我们是否可以添加 禁止转发 或 禁止复制 等安全功能 我不希望电子邮件的收件人转发或复制电子邮件的
  • 在多线程环境中捕获信号

    我有一个大型程序 需要尽可能具有弹性 并且有大量线程 我需要捕获所有信号SIGBUS SIGSEGV 并在必要时重新初始化有问题的线程 或者禁用该线程以继续减少功能 我的第一个想法是做一个setjump 然后设置信号处理程序 可以记录问题
  • java有类似C#的属性吗? [复制]

    这个问题在这里已经有答案了 C 属性 我的意思是 get 和 set 方法 是一个非常有用的功能 java 也有类似 C 的属性吗 我的意思是我们如何在 java 中实现类似以下 C 代码的内容 public string Name get
  • Adobe Illustrator 中的折线简化如何工作?

    我正在开发一个记录笔划的应用程序 您可以使用定点设备来绘制笔划 在上图中 我绘制了一个笔划 其中包含 453 个数据点 我的目标是大幅减少数据点的数量 同时仍然保持原始笔画的形状 对于那些感兴趣的人 上图笔画的坐标可以作为GitHub 上的

随机推荐

  • 通过 Heroku 上托管的 Rails 上传和解压缩文件到 S3?

    我希望能够将包含许多图像的 zip 文件上传到我的 Rails 应用程序 然后我希望 Rails 解压该文件并将其中的图像附加到我的照片模型中回形针 以便它们最终存储在我的 Amazon S3 帐户中 通过 Paperclip 配置 我想在
  • 从 Twitter 抓取用户位置

    我正在尝试从 Twitter 中获取用户名的纬度和经度 用户名列表是一个 csv 文件 一个输入文件中包含 50 多个名称 以下是我迄今为止所做的两次尝试 他们似乎都没有工作 欢迎对任何一个程序进行更正或采用全新的方法 我有清单User n
  • CoWaitForMultipleHandles API 的行为与文档不符

    这是由另一个问题我正在看着 阅读起来可能会有点长 请耐心等待 显然 CoWaitForMultipleHandles does not按照 MSDN 上记录的方式进行操作 下面的代码 基于原始问题 是一个控制台应用程序 它使用测试 Win3
  • Spring Boot RSocketRequester 处理服务器重启

    我有一个关于 Springs RSocketRequester 的问题 我有一个 rsocket 服务器和客户端 客户端连接到该服务器并请求 MessageMapping端点 它按预期工作 但是如果我重新启动服务器怎么办 如何从客户端自动重
  • 保持 GPS 服务正常运行并优化电池寿命

    我必须构建一个应用程序 其中 GPS 跟踪器运行大约一天 我知道 SO 中有类似的问题 但我还没有找到一些问题的答案 我需要每 10 分钟修复一次 GPS 所以我认为最好的方法是启动定位服务 进行修复 或超时 并停止服务 使用removeU
  • iOS (iPad) 上的 iframe 内容裁剪问题

    我正在寻找correct确保在 ipad iOS5 上的 iframe 中滚动后动态显示的内容可见的方法 哦 Iframe 和 iPad 你真是个了不起的老栗子 我知道 iPad 将 iframe 扩展到其内容的整个高度 几乎就像使用 HT
  • 使用 AFNetworking 2.0 上传图像

    我不明白为什么这这么难 网上所有的教程和文章似乎都在谈论 1 0 api 这是相当无用的 我尝试了几种不同的方法并得到了不同的结果 我究竟做错了什么 上传任务 这似乎没有使用多部分表单 wtf NSMutableURLRequest req
  • 在 Swift/iOS 中的应用程序之间共享文件数据[重复]

    这个问题在这里已经有答案了 我一直在研究如何在应用程序之间安全地共享数据 在我深入研究使用错误方法的实现之前 我想获得一些有关处理此问题的正确方法的信息 仅仅因为你可以做某事并不一定意味着你应该做某事 用户案例 我正在开发一套语言学习应用程
  • PHP error_reporting(0) 是否影响错误日志记录,或仅影响显示?

    Does error reporting 0 对错误记录 到文件 有任何影响 还是只是抑制屏幕上的错误显示 Thanks 是的 它对两者都有影响 error reporting 级别定义了错误的级别触发的 是否记录或显示这些错误由其他设置决
  • HTML5 视频 // 完全隐藏控件

    如何才能完全隐藏 HTML5 视频控件
  • 使用 vlookup 或索引/匹配函数对多行中的值求和

    我想使用公式对 B C 和 D 列中的值求和 我尝试结合SUMIF VLOOKUP and INDEX with MATCH但没有运气 我想查找 France 然后添加 B C 和 D 中的值 我努力了 SUM VLOOKUP A9 A1
  • 如何解决/破解 IE8 中半透明 PNG 褪色问题?

    如您所知 IE6 有一个 bug 如果不使用滤镜等非标准样式 就无法显示半透明 PNG 文件 在 IE7 中 此问题已得到修复 但它仍然存在一些关于 PNG 文件的错误 它无法正确显示褪色的半透明 PNG 文件 当您在 jQuery 中使用
  • OpenCV:如何找到轮廓/多边形内的颜色?

    这是我所拥有的 im cv2 imread luffy jpg gray cv2 cvtColor im cv2 COLOR BGR2GRAY ret thresh cv2 threshold gray 127 255 0 contours
  • 编写一个柯里化的 JavaScript 函数,该函数可以被调用任意次数,并在最后一次函数调用时返回一个值

    我目前正在用我的个人时间解决一个编程问题 要求我制作一个可以以这种方式调用的 JavaScript 函数 add 1 1 add 1 2 3 add 1 2 3 6 add 1 2 3 4 10 add 1 2 3 4 5 15 我无法弄清
  • OpenGL ES - 如何绘制填充多边形?

    我尝试在堆栈上进行谷歌搜索和搜索 但没有找到任何东西 在 OpenGL ES 中将不规则形状或其他多边形 卡通 精灵 映射到三角形 我想绘制一个填充多边形OpenGL ES在 iPad 上 2D 不需要 3D 我是 OpenGL OpenG
  • 将 HTML 文本同步并突出显示为音频

    如果有必要 我可以更详细地解释 但本质上我需要做的是与音轨同步对 HTML 文本进行 CSS 更改 即与音频播放同步突出显示单词 短语 我还需要通过单击文本来控制音频播放 我有很好的 HTML CSS 能力 但我对原始 js 不太擅长 所以
  • SonataAdminBundle - 检查“preUpdate”挂钩中的更改

    是否可以检查字段是否已更改preUpdate钩 我正在寻找类似的东西preUpdate hasChangedField fieldName 教义功能 有任何想法吗 这个问题有点类似于this one 您的解决方案只是将旧对象的字段与新对象的
  • Bootstrap & LESS:导入 mixins 仅作为参考

    我正在使用 Bootstrap 3 0 和 LESS 1 5 我将为许多网站使用相同的 bootstrap css 或使用他们的 CDN 所以我正在使用 import reference bootstrap 3 0 0 less boots
  • PHP 忽略我的 max_execution_time

    我的脚本中有一些关于使用 ffmpeg 转换视频的任务 我使用 codeigniter 2 0 3 执行此操作 并在库中找到脚本并使用 shell exec 运行 ffmpeg 我的 php 脚本中有 3 个任务 上传文件 将视频转换为 f
  • 在 ASP.NET Core Web API 中上传文件和 JSON

    如何使用分段上传将文件 图像 和 json 数据列表上传到 ASP NET Core Web API 控制器 我可以成功收到上传的文件列表multipart form data像这样的内容类型 public async Task