c# - 葡萄藤:如何解析表单数据
问题描述
有没有办法正确解析表单数据?我有一个接受一个文件的表单,尽管我可以在 ASP.NET API 上轻松完成,但我无法有效地解析和保存文件
有关更多上下文,我看到了此响应并尝试做同样的事情但没有成功。应该是因为老了。scottoffen/grapevine-legacy#193
我还检查了这个问题,但没有成功小道消息的文件上传示例
解决方案
您可以使用出色的HttpMultipartParser库轻松完成此操作。源代码和文档可在GitHub 上获得。这是使用 Grapevine 5.0.0-rc.9 的示例路线:
[RestRoute("Post", "/submit-form")]
[Header("Content-Type", "multipart/form-data")]
public async Task ParseMultipartFormData(IHttpContext context)
{
var content = await MultipartFormDataParser.ParseAsync(context.Request.InputStream, context.Request.MultipartBoundary, context.Request.ContentEncoding);
var name = $"{content.GetParameterValue("FirstName")} {content.GetParameterValue("LastName")} : {content.Files.Count}";
await context.Response.SendResponseAsync(name);
}
标头过滤器
Content-Type
是可选的,但它确实确保不会调用此路由,除非实际上有要解析的多部分表单数据。
使用 Postman 或其他工具,并传递FirstName
, LastName
, 和一个或多个文件,它将返回提交文件的连接名称和数量。在写入响应之前放置一个断点,您可以检查 的值content
以查看如何获取文件信息。那时将文件写入磁盘应该很容易。
重要的
请求上的输入流只能读取一次!如果您希望此数据可用于其他请求,请将其添加到context.Locals
,或者更好的是,使用以下中间件自动为您执行此操作!
public static class MultiPartFormData
{
public async static Task Parse(IHttpContext context, IRestServer server)
{
if (string.IsNullOrWhiteSpace(request.ContentType) || !request.ContentType.StartsWith("multipart/form-data; boundary=")) return;
context.Locals.TryAdd("FormData", await MultipartFormDataParser.ParseAsync(context.Request.InputStream, context.Request.MultipartBoundary, context.Request.ContentEncoding));
}
public static IRestServer AutoParseMultipartFormData(this IRestServer server)
{
server.OnRequestAsync -= MultiPartFormData.Parse;
server.OnRequestAsync += MultiPartFormData.Parse;
return server;
}
}
然后在配置您的服务器时,您可以对 进行简单的调用server.AutoParseMultipartFormData()
,如果数据存在,您可以在所有路由中使用数据,而无需显式解析。
推荐阅读
- python - Django如何使用modelformset_factory添加初始值?
- php - 在前 30 天已满后,如何取消每月定期收费?
- php - 试图让这个查询在 Lumen 项目中工作
- python - 如何用 Python 同时记录鼠标和键盘的移动?
- azure-devops - 在 Bug 或 PBI 详细信息页面中显示发布和阶段
- flutter - 输入'未来
' 不是类型 'List 的子类型 ' 在类型转换中 - sql - 无法获取 Snowflake 目标表的 dbname、rolename、userid、上次访问日期、读/写访问权限
- javascript - 按下键时如何使输入自动添加文本?
- python - 在交易商品问题中错误指定 puLP 中的某些内容(混合整数规划)
- javascript - 如果 GuildID 未在我的代码中列入白名单,如何让我的 Discord.js (Commando) 机器人离开服务器(加入时)?