Co do przechowywania obrazka w bazie danych: to zależy, jak zwykle nie ma prostych odpowiedzi. Ja zasugerowałem proste i sprawdzone rozwiązanie, ale możesz trzymać pliki bezpośrednio w bazie (w polach BLOB, czy nawet bardziej wymyślnych w MSSQL na przykład w rodzaju FILESTREAM). Też trochę zależy jakie to dane trzymasz w swoich bazach, bo dla niektórych będzie inaczej.
Ogólnie zobacz na przykład tutaj: https://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay
- Storage na bazę danych zazwyczaj jest droższy niż "ogólne" miejsce dyskowe (u dostawców - jeżeli masz własne serwery to to powiedzmy, że nie dotyczy) - zdarzają się dostawcy, którzy dadzą ci bazę tylko o rozmiarze 2 GB, ale 20 GB powierzchni dyskowej bez problemu; jak spojrzysz na przykład na Azure Blob Storage to kosztuje to 0,002€/GB miesięcznie, czyli prawie nic - a Azure SQL kosztuje już rzędu 0,005€ za godzinę (do 2 GB);
- W momencie, kiedy przechowujesz obrazki w taki sposób, że webserver może się do nich "dobrać" bez problemu może to być zdecydowanie wydajniejsze, bo nie będzie wymagało specjalnej pracy twojej aplikacji, pojawi się keszowanie, można robić CDN-y i inne szaleństwa;
- Nie lubię, bo baza dla mnie to zbiór uporządkowanych danych, a BLOB to taki... blob ;-)
Ale z drugiej strony trzymanie obrazka w bazie daje ci na przykład:
- Łatwiejszy backup/restore i replikację;
- Za jednym zamachem masz rekord i obrazek i jak usuwasz, nie musisz się specjalnie martwić obrazkami;
- Rollback czy izolację transakcji robi za ciebie baza danych, bez zmartwień.
Więc jest w sam raz jeżeli musisz dbać o spójność danych.
Jeżeli chciałbyś zrobić to samo z trzymaniem obrazka w bazie danych, to rozwiązanie będzie bardzo podobne - wystarczy, że zrobisz akcję, która będzie zwracać strumień bajtów pobrany z bazy danych, a ten strumień (byte[]
) będziesz trzymał w bazie. Może być bezproblemowo składową twojego obiektu. A potem w <img src>
odwołujesz się tylko do tej akcji.