1. 程式人生 > >Swagger Ui 之 .Net Core 上傳檔案

Swagger Ui 之 .Net Core 上傳檔案

在這篇文章中,我將向您展示如何自定義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);
            });