[Swagger] 檔案上傳與下載

原本一直在使用的 Swashbuckle 原來已經不更新,讓下載檔案的功能不正常,改用 Swagger-Net 就可以解決這個問題囉

開發環境

  • VS 2017
  • .NET 4.7.2

續用上一篇的範例 https://dotblogs.com.tw/yc421206/2019/02/15/web_api_file_upload_download

下載

用 Swagger 測試

  • Install-Package Swashbuckle

有關安裝請參考以下連結

https://dotblogs.com.tw/yc421206/2018/09/29/swagger_install_swashbuckle

這看起來很棒,但是當我按 Download 時,檔案開起來都是空的,檢查檔案大小,也不一樣了

換 Postman 試試

是正常的阿...

原來這是 Swagger UI 的 bug,Swashbuckle 用的是 Swagger UI 2.2,Swagger UI 3.x已經解決這個問題了。

https://github.com/domaindrivendev/Swashbuckle/issues/1064

Swashbuckle.AspNetCore 則是使用 Swagger UI 3.x

我仍保留有問題的 Swagger 專案,有興趣的可以直接下載測試
https://github.com/yaochangyu/sample.dotblog/tree/master/WebAPI/Swagger/UploadAndDownloadFiles/ServerSwashbuckle

解法左轉到 Swagger-Net

先移除

  • Uninstall-Package Swashbuckle
  • Uninstall-Package Swashbuckle.Core

再安裝

  • Install-Package Swagger-Net

下載 pdf 空白的問題就解決了

上傳

為特定的 Action 加上參數,目的是為了有上傳按鈕可以按

public class FileOperationFilter : IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        if (operation.operationId.ToLower() == "file_upload")
        {
            if (operation.parameters == null)
            {
                operation.parameters = new List<Parameter>();
            }
            else
            {
                operation.parameters.Clear();
            }
 
            operation.parameters.Add(new Parameter
            {
                name = "File1",
                @in = "formData",
                description = "Upload software package",
                required = false,
                type = "file"
            });
            operation.parameters.Add(new Parameter
            {
                name = "File2",
                @in = "formData",
                description = "Upload software package",
                required = false,
                type = "file"
            });
            operation.description = "swagger upload";
 
            operation.consumes.Add("application/form-data");
        }
    }
}

 

@SwaggerConfig.cs

套用 Filter

c.OperationFilter<FileOperationFilter>();

 

完成之後,畫面長這樣

完整範例下載

https://github.com/yaochangyu/sample.dotblog/tree/master/WebAPI/Swagger/UploadAndDownloadFiles

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo