在這篇文章中,我將向您展示如何自定義Swagger Ui以便在ASP.Net Core Web API項目中上傳文件,最近想做一個Swagger文件上傳,結果百度google都沒有發現可行的方案,看到的更多非.Net Core版本的,最後自己摸索寫了一個出來,希望微軟開源力度加大,讓社區更加活躍,歡迎大家一起討論提出寶貴的意見~
最終效果圖:
項目環境: VS2017 .NetCore2.0 C#7.0
開源框架: RestSharp Swagger Nlog
第一步
新建一個過濾器,命名爲SwaggerFileUploadFilter,過濾器要繼承swashbuckle提供的IOperationFilter,這樣我們可以用Swagger UI中的自定義文件上傳控件來替換或覆蓋參數。OperationId裏存放着控制器名+方法名+[httpverb],這樣可以實現定向過濾.
public class SwaggerFileUploadFilter : IOperationFilter
{
public void Apply(Swashbuckle.AspNetCore.Swagger.Operation operation, OperationFilterContext context)
{
if (operation.OperationId.ToLower() == "uploadgetpathpost")
{
if (operation?.Parameters?.Count > 0)
{
operation.Parameters.Clear();//Clearing parameters
}
else
{
operation.Parameters = new List<IParameter>();
}
operation.Parameters.Add(new NonBodyParameter
{
Name = "File",
In = "formData",
Description = "Uplaod Image",
Required = true,
Type = "file"
});
operation.Consumes.Add("multipart/form-data");
}
}
}
第二步
控制器上加上特性標籤[HttpPost(“/getpath”)],以下是控制器的代碼:
public class UploadController : BaseController
{
private const string _Prefix = "/upload";
/// <summary>
/// 獲取上傳圖片文件完整路徑
/// </summary>
[HttpPost(_Prefix + "/getpath")]
public string GetPath()
{
IFormFile file = HttpContext.Request.Form.Files[0];
string fileName = file.FileName;
string suffix = fileName.Split('.')[1];
string[] pictureFormatArray = { "png", "jpg", "jpeg", "bmp", "gif", "ico", "PNG", "JPG", "JPEG", "BMP", "GIF", "ICO" };
if (!pictureFormatArray.Contains(suffix))
{
return "the picture format not support ! you must upload files that suffix like 'png','jpg','jpeg','bmp','gif','ico'.";
}
var stream = file.OpenReadStream();
var restClient = new RestClient(ServerConfig.FileServiceUploadUrl);
var restRequest = new RestRequest(Method.POST);
restRequest.AddFile("file", stream.ReadAsBytes(), Guid.NewGuid().ToString("N") + ".png");
string path = "";
try
{
var res = restClient.Execute<Result<UploadInfo>>(restRequest);
path = res?.Data?.Data?.Path;
path = FileUrlHelper.PathToUrl(path);
Log.Trace($"圖片上傳成功。path:{path ?? "null"}");
}
catch (Exception ex)
{
Log.Error($"{ex.Message }圖片上傳出錯");
return path;
}
return path;
}
}
第三步
在Swagger配置文件,註冊過濾器SwaggerFileUploadFilter
// swagger
services.AddSwaggerGen(c => {
c.DocumentFilter<SwaggerEnumFilter>();
c.OperationFilter<SwaggerEnumFilter>();
c.OperationFilter<SwaggerFileUploadFilter>();
c.SwaggerDoc("v1", new Info {
Title = "Buddhism",
Version = "v1",
Description = @""
});
var basePath = PlatformServices.Default.Application.ApplicationBasePath;
var xmlPath = Path.Combine(basePath, "URun.Buddhism.Manage.xml");
var modelXmlPath = Path.Combine(basePath, "URun.Buddhism.Model.xml");
c.IncludeXmlComments(xmlPath);
c.IncludeXmlComments(modelXmlPath);
});