10-1.ASP.NET Core MVC 入門教學 - 讀取檔案加上存取權限

ASP.NET Core MVC 入門教學

如果我們是一個內部系統,那在做上傳檔案時的檔案路徑,就不應該是裸露可以直接用網址靜態路徑去讀取

而是有登入有權限才可以讀取檔案,所以上一節假設該上傳檔案不可隨意讓外人讀取

就要改另一個方式讀取檔案,而不是用靜態網址路徑去讀取

所以今天要這麼做,我們就要先來寫一個讀取內部檔案,並輸出的一支程式

首先先建立一個API

namespace Kcg.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class OutputController : ControllerBase
    {
        private readonly IFileProvider _fileProvider;
        public OutputController(IFileProvider fileProvider)
        {
            _fileProvider = fileProvider;
        }

        public IActionResult GetFile(string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                return BadRequest("找不到檔案");
            }

            var filePath = Path.Combine("news2", id + ".jpg");
            var fileInfo = _fileProvider.GetFileInfo(filePath);

            if (!fileInfo.Exists)
            {
                return NotFound("找不到檔案");
            }

            return File(fileInfo.CreateReadStream(), "image/jpeg");
        }
    }
}

然後把圖片src再改一下

<img src="/api/Output?id=@(Model.NewsId)" loading="lazy">

試一試可不可以讀出圖片

登出之後再讀取圖片,就可以發現沒有權限下讀取圖片被踢回登入頁面

如此利用程式去讀取檔案,就可以設定權限或很多其他額外的處理

最後這邊我們當然要把之前設定靜態檔案讀取給拿掉

//app.UseStaticFiles(new StaticFileOptions
//{
//    FileProvider = new PhysicalFileProvider(builder.Configuration.GetValue<string>("OutsidePhysicalFile")),
//    RequestPath = "/kcgupload",
//});

但其實這裡可能有經驗的會覺得並不一定要使用IFileProvider,用不少方式也可以做到

確實沒錯,但這就是一個選擇或習慣問題,因為使用依賴注入IFileProvider,對於其他方面會有不少好處

而且IFileProvider本身也提供不少檔案處理相關的方法,所以我這邊會比較習慣使用IFileProvider來做一些檔案處理

 

範例檔:下載




Copyright © 凱哥寫程式 2022 | Powered by TalllKai ❤