簡體   English   中英

葡萄藤:如何解析表單數據

[英]Grape vine: How to Parse Form Data

有沒有辦法正確解析表單數據? 我有一個接受一個文件的表單,但我無法有效地解析和保存文件,盡管我可以在 ASP.NET API 上輕松完成

有關更多上下文,我看到了此響應並嘗試做同樣的事情但沒有成功。 一定是因為老了斯科特芬/葡萄藤遺產#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上的 header 過濾器是可選的,但它確實確保不會調用此路由,除非實際上有要解析的多部分表單數據。

使用 Postman 或其他工具,並傳遞FirstNameLastName和一個或多個文件,它將返回連接的名稱和提交文件的數量。 在寫入響應之前放置一個斷點,您可以檢查content的值以查看如何獲取文件信息。 此時將文件寫入磁盤應該很容易。

重要的

請求中的輸入 stream 只能讀取一次,如果您希望此數據可用於其他請求,請將其添加到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() ,如果數據存在,您將可以在所有路由中使用該數據,而無需顯式解析它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM