Witam,
Chcę w swojej aplikacji webowej dodać funkcjonalność generowania i exportowania plików excelowych z poszczególnych tabel bazy danych.
Napisałem kontroler z pomocą poradnika do biblioteki EPPlus. Kontroler ten tworzy, zapisuje plik .xlsx w folderze wwwroot oraz zwraca do widoku link dzięki któremu możemy pobrać ten plik.
public async Task<IActionResult> Export()
{
string folder = _hostingEnvironment.WebRootPath;
string excelName = $"UserList-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";
string downloadUrl = string.Format("{0}://{1}/{2}", Request.Scheme, Request.Host, excelName);
FileInfo file = new FileInfo(Path.Combine(folder, excelName));
if (file.Exists)
{
file.Delete();
file = new FileInfo(Path.Combine(folder, excelName));
}
await Task.Yield();
List<UserInfo> list = new List<UserInfo>
{
new UserInfo{UserName="John", Age=20},
new UserInfo{UserName="Peter", Age=23}
};
using(var package = new ExcelPackage(file))
{
var workSheet = package.Workbook.Worksheets.Add("Sheet1");
workSheet.Cells.LoadFromCollection(list, true);
package.Save();
}
return View("Result", downloadUrl);
}
Po wykonaniu tej akcji w widoku ukazuje się link w stylu localhost:43356/UserList-XXXXXXXXX.xlsx
. Dzięki temu linku każdy użytkownik może pobrać stworzony plik.
Oczywiście gdyby w wwwroot był jakiś plik "test.txt" to KAŻDY użytkownik mógłby go ściągnąć wpisując adres
localhost:43356/test.txt
. Nie chcę aby coś takiego miało miejsce. Da się jakoś zablokować pobieranie plików z wwwroot za pomocą bezpośredniego URL?
Chciałbym osiągnąć efekt, że w bazie danych mam nazwy plików i powiązanych z nimi userów którzy mają do danego pliku dostęp. Tylko ci user'rzy którzy mają dostęp do pliku mogą go pobrać. W tym celu muszę jakoś zablokować te bezpośrednie url'y.
Jeśli ten sposób(tworzenie plików w wwwroot) jest zły, proszę o pomoc jak tego typu rzeczy się wykonuje w ASP.NET core.