ASP.NET Core API 檔案下載 示範

在 ASP.NET Core 中要下載檔案很簡單,下面是簡單的示範:
    
[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        var path = @"C:\Users\ruyut\Desktop\r2.png";
        var fileName = "r2.png";

        var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        return File(fileStream, "image/png", fileName);
    }
}
    

上面 FileStream 使用時是以唯獨的方式開啟,有其他應用程式開啟檔案時我們也可以讀取的到。
在本範例中直接寫死檔案名稱、路徑和檔案類型,請自行替換。

不過如果需要將檔案做處理,通常會將檔案讀取至記憶體中,這裡同時也加上讀取錯誤的例外回應:
    
[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        var path = @"C:\Users\ruyut\Desktop\r2.png";
        var fileName = "r2.png";

        try
        {
            var memoryStream = new MemoryStream();
            using var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            fileStream.CopyToAsync(memoryStream);

            memoryStream.Position = 0;
            return File(memoryStream, "image/png", fileName);
        }
        catch (Exception e)
        {
            return StatusCode(500, $"檔案讀取錯誤: {e.Message}");
        }
    }
}
    

只要使用瀏覽器開啟下面的網址就可以將檔案下載下來!(記得替換 port)
    
http://localhost:5027/Test
    

筆者以前都會加上檔案是否存在的檢查:
    
if (!System.IO.File.Exists(path))
    return NotFound();
    

不過後來發現部署在 IIS 上時很有可能會因為權限問題錯誤的判斷為檔案不存在,直接回傳 404 ,不過其實不判斷檔案是否存在就可以成功下載。而在 ASP.NET Core 中要判斷有沒有檔案權限又很麻煩(Windows 和 Linux 的做法不同),所以筆者後來都不會加上檔案存在的判斷,而是在回應時直接回傳 404 ,有問題再去看 log...

留言

張貼留言

如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com