介紹
實現這個功能主要還是依賴過濾器
在Swagger中利用 IOperationFilter 操作來實現文件上傳
與之前處理結合Idr4授權一樣的處理方式,不同的是授權處理的是Security,而文件上傳要處理的是Parameters,具體是IFormFile參數處理
IFormFile 在 Microsoft.AspNetCore.Http 命名空間下
怎么來處理呢?
options.OperationFilter<IdentityServer4OAuth2OperationFilter>();
這是之前處理授權用的,名稱就這樣了,接下來我在里面去處理
處理方式有幾種
你可以根據路由來判斷也可以根據參數類型來處理,這里我根據參數類型來處理,只要包含了IFormFile 就生成該文件
第一步:獲取IFormFile 參數類型的 參數
var files = context.ApiDescription.ActionDescriptor.Parameters.Where(n => n.ParameterType == typeof(IFormFile)).ToList();
第二步:遍歷替換這些參數
for (int i = 0; i < files.Count; i++) { if (i == 0) { operation.Parameters.Clear(); } operation.Parameters.Add(new NonBodyParameter { Name = files[i].Name, In = "formData", Description = "Upload File", Required = true, Type = "file" }); }
operation.Consumes.Add("multipart/form-data");
這里需要注意的就是這句話
operation.Parameters.Clear();
需要清除原來中的參數,如果不清除你會看到下面的效果(富含了原有參數 IFormFile)
清除了之后看下實際效果,其實就是替換掉原有的參數形式
這里還有一點值得注意的就是 請求的參數要與 重新添加的參數名稱要一致 不然提交獲取不到相關的文件信息(如果你是手寫的話要注意這點,我這里是動態獲取的參數,所以不存在這個問題)
下面是完成代碼,這里面附帶了 Idr4的授權 不需要可以刪除掉
public class IdentityServer4OAuth2OperationFilter : IOperationFilter { public void Apply(Operation operation, OperationFilterContext context) { #region Swagger授權處理 if (operation.Security == null) { operation.Security = new List<IDictionary<string, IEnumerable<string>>>(); } else { operation.Security.Add(new Dictionary<string, IEnumerable<string>> { {"oauth2", new List<string> { "openid", "profile", "userservicesapi" }} }); } #endregion #region Swagger 文件上傳處理 var files = context.ApiDescription.ActionDescriptor.Parameters.Where(n => n.ParameterType == typeof(IFormFile)).ToList(); if (files.Count > 0) { for (int i = 0; i < files.Count; i++) { if (i == 0) { operation.Parameters.Clear(); } operation.Parameters.Add(new NonBodyParameter { Name = files[i].Name, In = "formData", Description = "Upload File", Required = true, Type = "file" }); }
operation.Consumes.Add("multipart/form-data");
}
#endregion
}
}
選擇文件運行下 兩個文件都接受到了