Używam azure blob storage jako miejsce przechowywania plików.
Użytkownik podczas tworzenia nowej "sprawy" może wgrywać załączniki (albo dodawać załączniki do istniejącej sprawy, analogiczna sytuacja) - strzela więc do api i dostaje token do kontenera i bezpośrednio do niego wrzuca pliki, nie chcę przepuszczać tego ruchu przez serwer aplikacyjny. W momencie tworzenia sprawy razem z danymi o sprawie przesyła jeszcze dane plików - np. jakieś komentarze, kategorie, itd. oraz adresy plików, które wrzucił na bloba.
Chciałbym zapewnić, że na blobie nie przechowuję niepotrzebnie plików, do których nie mam referencji w bazie.
Może to powstać np. w sytuacji gdy ktoś zacznie uploadować pliki, ale nie zapisze sprawy i wyłączy przeglądarkę, albo przy tworzeniu sprawy wrzuci plik do kontenera, po chwili jednak się rozmyślił i chce go usunąć, ale blob storage na chwilę przestał odpowiadać. Podobnie w sytuacji wgrywania dodatkowych plików do istniającej sprawy, udało się wrzucić na bloba, ale już nie udało się zapisać informacji o tym w bazie przy kolejnym strzale, użytkownik zobaczył błąd i odświeżył stronę.
Na szybko wpadłem na pomysł, żeby każdy taki upload najpierw trafiał na blobie do jakiegoś kontenera "staging", który byłby automatycznie czyszczony co jakiś czas (można to nawet z automatu skonfigurować na azure blob storage, albo słuchać na eventy z event grida i sobie kolejkować, albo nawet ręcznie co X czasu skanować bloba i usuwać pliki starsze niż X czasu). W momencie strzału do api z listą plików byłyby one kopiowane z kontenera stagingowego do kontenera docelowego dla danej sprawy - pewnie warto to przepuścić przez jakąś kolejkę.
Dodatkową zaletą takiego rozwiązania jest to, że zanim skopiuję pliki do kontenera docelowego i będą widoczne dla innych użytkowników, mogę je jeszcze przeskanować pod kątem jakiegoś malware'u.
Co o tym myślicie?
A może jest jakiś prostszy sposób? ;)