花了一些時間,檔案上傳的工具算是初步完成了,雖然要這功能其實很容易實作,但我要的是可以隨時切換不同的檔案上傳目的地,目前已經有一個初版。

檔案 clone 下來後,首先打開 appsettings.json 檔案:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "FileUploaderConfig": {
    "LocalFilePath": "Datas\\files\\",
    "AzureConnectonString": "<your key>"
  }
}

目前工具支援將檔案上傳到本機或是 Azure 上,appsettings.json 是用來設定這兩個上傳方式的設定,FileUploaderConfig 是本機的資料夾。而 AzureConnectonString 就是 Azure 上的連線字串。

接下來看 Startup.cs 檔案:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    Helpers.Utilities.Configuration = Configuration;
    Type uploaderType = libs.FilesSaver.UploaderFactory.CreateFileUploader(libs.FilesSaver.FileUploaderType.AzureStorage, Configuration);
    services.AddTransient(typeof(libs.FilesSaver.IFileUploader), uploaderType);
}

Type uploaderType = libs.FilesSaver.UploaderFactory.CreateFileUploader(libs.FilesSaver.FileUploaderType.AzureStorage, Configuration); 是設定檔案上傳要使用本機或 Azure,最後一行就是 DI 的設定。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{

    ......
    Helpers.Utilities.ServerPath = env.WebRootPath + "\\";
}

上面的設定是為了要讓上傳工具可以知道網站的真正根目錄位置,如果是用 Azure 的話就不用設定。接下來看 Web API 的程式碼:

[Route("api/[controller]")]
[ApiController]
public class FileUploadingController : ControllerBase
{
    private IFileUploader fileUploader;

    public FileUploadingController(IFileUploader fileUploader)
    {
        this.fileUploader = fileUploader;
    }

    // GET api/<controller>/5
    [HttpGet("{id}")]
    public IActionResult Get(string id)
    {
        FileInfo fileInfo = fileUploader.GetFile(id);
        return File(fileInfo.FileStream, "application/octet-stream", fileInfo.FileName);
    }

    // POST api/<controller>
    [HttpPost]
    public IActionResult Post([FromForm]IFormFile file)
    {
        FileInfo fileInfo = new FileInfo
        {
            FileName = file.FileName,
            FileStream = file.OpenReadStream(),
            Token = FileInfo.CreateToken("peter", file.FileName),
            Version = "0.1"
        };
        fileUploader.WriteFile(fileInfo);
        return new JsonResult(new { Token = fileInfo.Token });
    }
}

除了上傳檔案要設定 FileInfo 物件,下載檔案就比較單純,只要用 token 就可以直接取得了。

參考資料