如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件

在上一篇文章(如何在 .NET Core WebApi 中处理 MultipartFormDataContent)中,我们有描述过如何以最简单的方式在 .NET Core WebApi 中处理 MultipartFormDataContent 。基于框架层面的封装,我们可以快速的从 Request.Form 中分别拿到文件内容和文本内容,但是这些默认的解析方式都是建立在前后端以标准的数据格式来进行构建和解析。

问题描述

如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件

上图示例展示了用户通过 IOS 客户端发送请求时,对应后端接口接收到的 Request 内容。从请求内容的整体结果,我们可以看出这是一个 multipart/form-data 的数据格式,由于这种数据是由多个 multipart section 组成,所以我们可以看出在这个请求体中,是包含3个 section ,name 值分别为 Agree,CultureCode,FingerSignature,每个 section 都会包含一个 Content-Disposition 字段,前面两个 section都是普通的数据格式,最后一个是图片类型的数据。当后端接口接收到这样一个请求体时,尝试使用 Request.Form.Files 的方式来获取目标文件时,发现无法获取 FingerSignature 对应的文件内容。

问题分析

通过和客户沟通,了解到FingerSignature 对应的文件是会被一起放到请求体中传给后端,客户表示前端APP这一块的逻辑在后端还没有升级成 ASP.NET Core(处于 Framework 阶段)的时候是可以正常工作的。通过查看ASP.NET Core 中对 Request.Form 的赋值逻辑: FormFeature 实现,找到了如下逻辑函数:

如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件

通过源码的逻辑,我们可以看出,只有当前的 section 对应的 Content-Disposition 同时包含 form-data 和 fileName (或 fileNameStar),才会被作为文件来处理(示例:form-data; name="FingerSignature"; fileName=”xxxx.jpeg”),否则并不会把当起的 Section 添加到 Request.Form.Files 中。此时结合上面获取的请求内容,定位到 FingerSignature 部分的 Content-Disposition 中由于缺少 fileName 字段导致后端无法解析到对应文件为该issue 的 Root Cause。

解决方案

由于前端 APP 已经发布多个版本,所以让前端来补全这个字段显然不是一种稳妥的修复方案,因此后端需要做一个兼容性处理。当遇到这种不是标准格式的文件内容,需要通过 MultipartReader 对象来处理 MultipartFormDataContent 对应的 Section 内容(实际上 Request.Form.Files 底层逻辑就是通过 MultipartReader 来依次解析每个 Section 内容)。这里实现了一个方法来获取当前 MultipartFormDataContent 中的所有文件:

如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件

在这个方法中有2个细节地方需要注意。

  • 默认情况下,Request.Body 中的内容只允许读取一次,所以我们需要在使用这个方法的路由地方启用 EnableBuffering 设置,这里可以自定义一个 Filter 来复用这种特性:

如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件

  • 因为对 Request.Body开启 EnableBuffering 了,所以在调用 ReadFilesAsyns 方法的时候,不确定此时 Body 中的 Stream起始位置为 0。所以我们需要在读取 Body 之前和之后通过 Seek 方法将 Stream的 Position 重置归 0。

优化建议

从目前的修复方案来讲的话,后端只是提供了一种妥协的修复方案来适配前端的数据不完整,因此感觉比较完善的修复方案是前端在发送 multipart/form-data 的数据时,尽量以标准的方式来构建每个 Section 内容,尤其是文件类型。如果前后端都能以统一的数据格式来进行交互,自然也就不会出现上述所说的这种问题,潜在的风险自然也就变小了。

原文链接:https://www.cnblogs.com/hippieZhou/p/17316146.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件 - Python技术站

(0)
上一篇 2023年4月25日
下一篇 2023年4月27日

相关文章

  • C#对JSON与对象的序列化与反序列化

    下面是详细讲解”C#对JSON与对象的序列化与反序列化”的完整攻略。 什么是序列化和反序列化 序列化是将对象的状态转换为可存储或传输的形式的过程,通常将对象转换为二进制流或文本格式(如JSON或XML)。反序列化是将序列化后的数据重新转换回对象的过程。 在C#中,可以使用序列化将对象转换为JSON格式,以便在网络上传输或存储数据。 C#中的JSON序列化和反…

    C# 2023年6月3日
    00
  • C#操作图片读取和存储SQLserver实现代码

    为了操作图片读取和存储SQL Server,我们需要使用C#语言和SQL Server数据库。在这个过程中,我们将通过以下步骤实现: 读取图片文件 将图片文件转换为字节数组(byte数组) 将字节数组保存到SQL Server中 从SQL Server中读取字节数组 将字节数组转换回图片文件 下面是一个示例代码,在SQL Server中保存图片: // 定义…

    C# 2023年6月1日
    00
  • C#用链式方法表达循环嵌套

    在C#中,可以使用链式方法表达循环嵌套,以简化代码并提高可读性。本文将介绍如何使用链式方法表达循环嵌套,并提供两个示例。 使用链式方法表达循环嵌套 链式方法是一种在方法调用中使用点号连接多个方法的技术。在C#中,可以使用链式方法表达循环嵌套,以避免使用传统的for循环嵌套。 以下是一个使用链式方法表达循环嵌套的示例: Enumerable.Range(1, …

    C# 2023年5月15日
    00
  • 由vbs sort引发.NET Framework之间的关系说明

    由于题目中缺少具体的上下文,我假设这是一篇介绍VBScript(vbs)和.NET Framework之间关系的文章。以下是完整攻略: 1. VBScript与.NET Framework的关系 VBScript是一种基于COM(Component Object Model)的脚本语言,早期被广泛应用于Windows系统管理和自动化任务。而.NET Fram…

    C# 2023年6月3日
    00
  • Visual C#类的定义及实现方法实例解析

    Visual C#类的定义及实现方法实例解析 什么是C#类? C#类是指数据结构和函数的结合体。它定义了一种数据类型,用于表示抽象和具体的概念。C#类通常包含属性、方法、构造函数、索引器、事件等成员。 如何定义C#类? 要定义一个C#类,你需要使用class关键字。 下面是一个简单的C#类定义实例: public class Person { private…

    C# 2023年6月6日
    00
  • Js 导出table内容到Excel的简单实例

    首先我会讲解如何通过js导出table内容到Excel。以下是完整的攻略: 准备工作 编写html页面,并在页面中创建一个table并填充数据 导入jquery、TableExport等库文件 步骤 加载TableExport插件库文件 <script src="js/FileSaver.min.js"></script…

    C# 2023年6月1日
    00
  • 详解ASP.NET Core中间件Middleware

    详解ASP.NET Core中间件Middleware攻略 ASP.NET Core中间件Middleware是一种用于处理HTTP请求和响应的组件。在本攻略中,我们将深入探讨ASP.NET Core中间件Middleware的工作原理,并提供两个示例说明。 中间件Middleware的工作原理 在ASP.NET Core中,中间件Middleware是一种…

    C# 2023年5月17日
    00
  • SQL Server 2008 安装SQLDMO.dll的方法

    首先需要明确的是,SQLDMO.dll是SQL Server的一个重要组件,许多应用程序需要它来连接和操作SQL Server数据库。在安装SQL Server 2008时,SQLDMO.dll并不是自动安装的,因此在使用一些依赖SQLDMO.dll组件的应用程序时,需要手动安装SQLDMO.dll。 下面是基本步骤: 1. 下载SQLDMO.dll文件 可…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部