Spring - przygotowywanie pliku do pobrania

Spring - przygotowywanie pliku do pobrania
Belka
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: PL
  • Postów: 452
0

Hej,

chciałbym zaimplementować w pewnym swoim projekcie możliwość pobrania pliku przez użytkownika. Zasada działania ma być taka, że użytkownik klikając przycisk "Export to file" powinien zainicjować pobieranie pliku. Plik ten z założenia nie jest jakimś zasobem dostępnym na serwerze, tylko normalnym plikiem tekstowym do którego mają być sparsowane dane z bazy (różne dla każdego użytkownika).

Wyczytałem, że w kontrolerze mogę posłużyć się adnotacją @ResponseBody i przekazać plik korzystając ze Springowej klasy FileSystemResource. Jednak jaka jest konwencja przy tworzeniu pliku? Przeglądam dokumentację i widzę kilka konstruktorów klasy File, w tym ten najbardziej mi znany File(String path), lecz ja nie chcę go tworzyć na "serwerze". Chciałbym tylko, aby był Wygenerowany i posłany do pobrania, natomiast nie chcę go przechowywać, bo zawartość pliku zmienia się pod upływem czasu i jest zależna od danych w DB.
Apka nie posiada RESTowego API, lecz HTML. Korzystam też z Thymeleafa.

Z góry dzięki za pomoc i wskazówki! :)

WE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 53
1

Myślę, że jeśli nie chcesz go nigdzie zapisywać to zamiast File lepiej zastosować tutaj ByteArrayOutputStream.

S9
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 3573
0

Zwróc byte[] i tyle, zakładając oczywiście że ten plik nie jest jest gigantyczny :D

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1909
0

Zwróć uwagę, na której puli wątków będziesz to robił. HINT: jak nie zabić serwera?

Belka
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: PL
  • Postów: 452
0
Charles_Ray napisał(a):

Zwróć uwagę, na której puli wątków będziesz to robił. HINT: jak nie zabić serwera?

Jesteś w stanie trochę rozwinąć temat?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Użyj Springowego ByteArrayResource. Ma to taki ukryty plus, że Spring auto-magicznie obsłuży ci wtedy headery od content-rage.

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1909
0
Belka napisał(a):
Charles_Ray napisał(a):

Zwróć uwagę, na której puli wątków będziesz to robił. HINT: jak nie zabić serwera?

Jesteś w stanie trochę rozwinąć temat?

Generowanie pliku jest operacja „długotrwałą” i powinna zostać obsłużona na dedykowanej puli wątków. Przy dużym ruchu możesz wysycić pulę wątków serwera. W Springu wystarczy zwrócić CompletableFuture/DeferredResult/Observable/Mono, aby pod spodem zadziałał async dispatch.

Belka
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: PL
  • Postów: 452
0
Charles_Ray napisał(a):

Generowanie pliku jest operacja „długotrwałą” i powinna zostać obsłużona na dedykowanej puli wątków. Przy dużym ruchu możesz wysycić pulę wątków serwera. W Springu wystarczy zwrócić CompletableFuture/DeferredResult/Observable/Mono, aby pod spodem zadziałał async dispatch.

Brzmi dla mnie na ten moment trochę skomplikowanie, ale chyba muszę zgłębić temat :) W każdym razie na pewno ta wiedza się przyda.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.