REST WebAPI upload/przechowywanie zdjęć

0

Witam, tworzę z kolegą, który dłubie w Angularze, mały projekt i zatrzymaliśmy się na edycji profilu użytkownika. Kolega zaproponował, że po stronie frontendu będzie kompresował zdjęcia poniżej 2mb i przesyłał je w base64.

{
	bg_img,
	img,
	name,
	websiteUrl,
	address,
	desciption (html),
	socials{
		name,
		url
	},
	...
}	

Tak wyglądałby JSON, gdzie bg_img jest zdjęciem w tle, a img głównym. Następnie miałbym je konwertować do pliku, zapisywać i przechowywać w bazie ścieżkę zapisu. Czy takie rozwiązanie byłoby poprawne przy małej aplikacji, pomimo że zdjęcia są przesyłane w akcji PUT przy każdej edycji?

Czy lepiej wykorzystać osobne akcje z IFormFile do samej zmiany zdjęć i osobnej do reszty treści?
W jednym wątku na forum przeczytałem, że nie wypada przesyłać IFormFile do warstwy serwisów, tylko samą ścieżkę zapisu. Jeśli kilka kontrolerów będzie korzystać z uploadu zdjęć to mogą po dziedziczyć po kontrolerze z prywatną metodą zapisu w wwwroot, czy wstrzykiwać osobną klasę z tą metodą?

2

Jak zauważyłeś, przesyłanie plików binarnych z przeglądarki jest dość upierdliwe :) wiele razy z tym walczyłem przy projektach studenckich.

Powiem tak - jeśli to mały projekt hobbistyczny, to jak najbardziej użyj base64 i przesyłaj obrazki jako pola w JSONach. Możesz nawet po stronie backendu zdekodować je i zapisać w bazie danych jako BLOB (w przypadku SQL), albo nawet jako ten oryginalny gigantyczny string base64. Będzie to nieoptymalne, wolne i na większą skalę jest to zła praktyka. Ale na 99,9% nikt nie ucierpi w twoim przypadku.

Natomiast sposób "lepszy" to jest jak mówisz - przesyłanie plików binarnych osobno jako form-data, zapisywanie ich w jakimś folderze na serwerze, nadawanie ID + zapis ścieżki w bazie, potem korelowanie tego z profilem użytkownika po ID. Można nawet pójść dalej w zabawę np. z AWS S3 z pre-signed URL i wrzucanie binarek do S3 z pominięciem serwera w ogóle. Ale to tylko w razie potrzeby :)

1

Nie miel tego frontowo, wyślij porządnie multipart/form-data z obiektu js FormData. A całe przetwarzanie powinno być po stronie backendu.

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