如果我們是一個內部系統,那在做上傳檔案時的檔案路徑,就不應該是裸露可以直接用網址靜態路徑去讀取
而是有登入有權限才可以讀取檔案,所以上一節假設該上傳檔案不可隨意讓外人讀取
就要改另一個方式讀取檔案,而不是用靜態網址路徑去讀取
所以今天要這麼做,我們就要先來寫一個讀取內部檔案,並輸出的一支程式
首先先建立一個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來做一些檔案處理
範例檔:下載