• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pobieranie wszystkich obrazów z folderu publicznego po zbudowaniu aplikacji [React + Vite]

0 głosów
449 wizyt
pytanie zadane 19 lipca 2023 w JavaScript przez Oskar Szkurłat Bywalec (2,780 p.)

Chciałbym zrobić galerię zdjęć na stronie, ale nie chcę przechowywać plików na zewnętrznym serwerze, więc moim pomysłem jest przechowywanie wszystkich obrazów w folderze publicznym projektu. Głównym założeniem jest możliwość dodawania kolejnych plików do listy po zbudowaniu aplikacji. Korzystam z frameworka React+Vite.

Pobrałem wszystkie pliki z folderu `public/gallery`. `import.meta.glob` zwraca funkcje, które zwracają Promise. Dlatego wywołałem każdą funkcję i z promisów uzyskałem adresy URL plików.

interface ImportImageData {
  default: string
}

type ImportImageGlob = () => Promise<ImportImageData>
useEffect(() => {
    const fetchGallery = (): void => {
      const images: ImportImageGlob[] = Object.values(
        import.meta.glob('/public/gallery/*')
      ) as ImportImageGlob[]

      _.forEach(images, (fetchImg: ImportImageGlob): void => {
        fetchImg()
          .then((data: ImportImageData): void => {
            setDataSource((prev: string[]): string[] => {
              return _.uniq([...prev, data.default])
            })
          })
          .catch((): void => {})
      })
    }

    fetchGallery()
  }, [setDataSource])

W wersji developerskiej aplikacji wszystko działa idealnie. Jednak w wersji produkcyjnej lista plików nie jest odświeżana, tzn. kiedy dodaję nowy obraz, wyświetlane są tylko poprzednie pliki.

Jak mogę rozwiązać ten problem? Czy jest jakieś inne rozwiązanie na ten problem?

Z góry dziękuję

1 odpowiedź

+3 głosów
odpowiedź 19 lipca 2023 przez jankustosz1 Nałogowiec (37,030 p.)
wybrane 20 lipca 2023 przez Oskar Szkurłat
 
Najlepsza
Cały kod js jest wykonywany po stronie przeglądarki klienta. Zastanów się skąd miałby on wiedzieć, że gdzieś na serwerze dodałeś sobie jakiś plik? Do tego pewnie hostujesz stronę statycznie na jakimś nginxie lub apatchu, więc nie masz możliwości przesłać informacji o plikach w tym katalogu.

Potrzebujesz odpalić prosty serwer rest np. w express, który jedyne co będzie robił to będzie odpowiadał na zapytanie do niego mówiąc jakie pliki znajdują się w tym katalogu. Wtedy będziesz mógł sobie we frontendzie wysłać do niego request i dowiedzieć się jakie pliki będą istnieć w katalogu /public/gallery.

Co do import.meta.glob to wygląda na to, że w czasie builda, vite patrzy jakie są pliki w tym katalogu i gdzieś zapisuje ich nazwy w wynikowym bundlu.
komentarz 20 lipca 2023 przez Oskar Szkurłat Bywalec (2,780 p.)
To co piszesz jest w pełni zrozumiałe :). Niestety w tym przypadku dostałem właśnie tylko dostęp do przestrzeni dyskowej. Gdyby nie to, napisałbym API i przechowywał ilustracje w DB. Bo tak chyba się powinno w takich przypadkach?
1
komentarz 20 lipca 2023 przez jankustosz1 Nałogowiec (37,030 p.)
To jedyne co mogę zaproponować to żebyś zrobił sobie jakiś plik tekstowy z listą nazw tych plików i przy dodawaniu kolejnych obrazów ten plik aktualizował. A frontend pierwsze co zrobi to pobierze sobie ten plik i zobaczy jakie obrazy są dostępne.

Ewentualnie możesz np. nazywać ten obraz 1.jpg, 2.jpg itd. wtedy frontend mógłby próbować pobrać kolejne numery aż nie dojdzie do 404.
komentarz 20 lipca 2023 przez Oskar Szkurłat Bywalec (2,780 p.)
Dosłownie zacząłem tak robić :)

No cóż to dziękuję bardzo za wyjaśnienie i rady

Podobne pytania

0 głosów
1 odpowiedź 264 wizyt
pytanie zadane 26 grudnia 2020 w JavaScript przez sKodowany Obywatel (1,150 p.)
0 głosów
1 odpowiedź 326 wizyt
pytanie zadane 30 kwietnia 2019 w JavaScript przez Hasira Bywalec (2,100 p.)
0 głosów
0 odpowiedzi 295 wizyt

93,599 zapytań

142,524 odpowiedzi

322,993 komentarzy

63,082 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...