[英]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 或其他工具,並傳遞FirstName
、 LastName
和一個或多個文件,它將返回連接的名稱和提交文件的數量。 在寫入響應之前放置一個斷點,您可以檢查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.