在 ASP.NET Core 中要下載檔案很簡單,下面是簡單的示範:
上面 FileStream 使用時是以唯獨的方式開啟,有其他應用程式開啟檔案時我們也可以讀取的到。
在本範例中直接寫死檔案名稱、路徑和檔案類型,請自行替換。
不過如果需要將檔案做處理,通常會將檔案讀取至記憶體中,這裡同時也加上讀取錯誤的例外回應:
只要使用瀏覽器開啟下面的網址就可以將檔案下載下來!(記得替換 port)
筆者以前都會加上檔案是否存在的檢查:
不過後來發現部署在 IIS 上時很有可能會因為權限問題錯誤的判斷為檔案不存在,直接回傳 404 ,不過其實不判斷檔案是否存在就可以成功下載。而在 ASP.NET Core 中要判斷有沒有檔案權限又很麻煩(Windows 和 Linux 的做法不同),所以筆者後來都不會加上檔案存在的判斷,而是在回應時直接回傳 404 ,有問題再去看 log...
[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...
感謝教學~
回覆刪除