首页 > 解决方案 > 葡萄藤:如何解析表单数据

问题描述

有没有办法正确解析表单数据?我有一个接受一个文件的表单,尽管我可以在 ASP.NET API 上轻松完成,但我无法有效地解析和保存文件

有关更多上下文,我看到了此响应并尝试做同样的事情但没有成功。应该是因为老了。scottoffen/grapevine-legacy#193

我还检查了这个问题,但没有成功小道消息的文件上传示例

标签: c#.netgrapevine

解决方案


您可以使用出色的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(),如果数据存在,您可以在所有路由中使用数据,而无需显式解析。


推荐阅读