ASP.NET Core에서 Swagger를 사용하여 파일 업로드 API

7133 단어 swaggerC#ASP.NET_Core
ASP.NET Core 에서 Swashbuckle 있다.
    /// <summary>
    /// Swagger UI 用ファイルアップロードフィルタ
    /// </summary>
    public class UploadFileOperationFilter : IOperationFilter
    {
        /// <summary>
        /// フィルタ適用
        /// </summary>
        /// <param name="operation">オペレーション</param>
        /// <param name="context">コンテキスト</param>
        public void Apply(Operation operation, OperationFilterContext context)
        {
            operation.Consumes.Add("multipart/form-data");
            operation.Parameters = new IParameter[]
            {
                new NonBodyParameter()
                {
                    Name = "file",
                    In = "formData",
                    Required = true,
                    Type = "file",
                    Description = "アップロードするファイル",
                }
            };
            return;
        }
    }

이러한 필터 클래스를 작성해, 업로드 API 의 메소드에 SwaggerOperationFilter 속성을 개입시켜 지정한다.

    [Produces("application/json")]
    [Route("api/v1/uploadfile")]
    public class UploadController : Controller
    {
        [HttpPost]
        [SwaggerOperationFilter(typeof(UploadFileOperationFilter))]
        public async Task<IActionResult> UploadFile(IFormFile file)
        {
            // ここではオリジナルのファイル名の拡張子を取り出し
            // 格納するときは GUID をベースの名前に変えている。
            var orgFileName = ContentDispositionHeaderValue
                .Parse(file.ContentDisposition)
                .FileName.Trim('"');
            var uploadFileName = Guid.NewGuid().ToString() + Path.GetExtension(orgFileName);
            var url = await UploadToStorage(file.OpenReadStream(), uploadFileName);
            return Json(url);
        }

        private async Task<string> UploadToStorage(Stream stream, string fileName)
        {
            // stream からデータを取り、
            // それを適当なストレージに格納し、
            // その URL を返す 処理を実装。
            return "https://xxx.xxx.xxx/xxx/" + fileName;
        }
    }


UI 에서는 이러한 표시에.



[찾아보기]에서 파일을 지정하여 보내면 Response에 주소가 반환됩니다.
#처음의 샘플 코드에서는, 실제로 보존하는 처리는 구현하고 있지 않습니다만.

좋은 웹페이지 즐겨찾기