.Net Core + Angular Wyświetlanie zdjęć

0

Cześć. Tworzę aplikację BE .Net core i FE Angular. Przechowuję w bazie scieżkę do obrazka. I moje pytanie gdzie powinienem przechowywać zdjęcia tzn gdzie powinienem je zapisywać kiedy użytkownik uploaduje zdjęcie oraz jak takie zdjęcie wyświetlić po stronie Angular ?

2
  1. Tworzysz folder np. Resources
  2. Dodajesz te linie do metody Configure w startup.cs
app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions()
{
    FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"Resources")),
    RequestPath = new PathString("/Resources")
});
  1. W kontrolerze odpowiednio zapisujesz zdjęcie poprzez interfejs IFormFile.

Dokumentacja:

3

Jeżeli dostęp do obrazków lub ogólnie plików ma przejść przez jakieś sprawdzenie uprawnień, to możesz wystawić sobie akcje w kontrolerze

typu Download/{fileId}, wykonać checki i zwrócić FileStreamResult z odpowiednim content-type.

Później na froncie masz po prostu <img src="Download/123456" />

1
Michał Warmuz napisał(a):

Kurcze a gdzie mam stworzyć ten folder. Bo mam 4 warstwy Aplikacji API. Core, Infrastructure, Services, Data i API. Bo według dokumentacji muszę w tym folderze API a czy nie lepiej w innej warstwie ? :)

Tu nawet nie chodzi o folder rozumiany jako folder projektu, ale bardziej jako fizyczny. Ja bym go umieścił przy API. Bo to udostępnianie plików statycznych należy do zadań warstwy prezentacji. Oczywiście konfiguracja o której jest mowa w dokumentacji może pochodzić z innych warstw. Jeżeli tworzysz coś na styl onion/hexagonal architecture to raczej nie na miejscu jest przekazywanie IFormFile poza warstwę prezentacji, ale może to być np. tablica bajtów.

Ja podchodzę do tego tak, że jeżeli warstwy, inne niż prezentacji, nie potrzebują więcej informacji niż fizyczne miejsce zapisu to np. w sytuacji gdzie mam obsłużyć żądanie utworzenia pracownika wraz ze zdjęciem. Wszystkie pola związane z utworzeniem pracownika idą do warstwy wewnętrznej (często nazywanej "Core"). Samo zdjęcie jest przetwarzane w jakimś serwisie w warstwie prezentacji (mvc/api). Tylko informacja gdzie zostanie zapisane zdjęcie jest przekazywana dalej.
Jeżeli utworzenie użytkownika nie jest możliwe, to zapis zdjęcia na dysku nie jest potrzebny. Jako, że korzystam ze wzorca Unit Of Work. Jeżeli utworzenie pracownika się powiodło, a wystąpił błąd z zapisem zdjęcia to następuje rollback + logowanie informacji o błędzie.

2

Ja to bym wywalił pliki aplikacji na inny dysk :>

Aplikacja niby ma być stateless, że jak się wywali to stawiamy nowy kontenerek z appką i nic się nie stało, ale pliki i baza mają być trwałe, backupowane, więc ich raczej nie trzymamy na np. dockerze.

Jak będziemy mieli dwie lub więcej instancji aplikacji, to przecież dziwnie będzie gdy obie będą sobie zapisywały i odczytywały ze swojego folderu, a nie jakiegoś współdzielonego pomiędzy wszystkie instancje. (chociaż z drugiej strony zazwyczaj instancje nie są na 1 serwerze :D)

1 użytkowników online, w tym zalogowanych: 0, gości: 1