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

problem z wyswietlaniem zdjeć z serwera w htmlu

Object Storage Arubacloud
0 głosów
163 wizyt
pytanie zadane 14 czerwca 2018 w JavaScript przez besthost Nowicjusz (200 p.)

Mam problem z wyświetlaniem obrazów w htmlu. Jestem zielony w temacie danych binarnych, ale kombinowałem na różne sposoby i nic ;(
Tutaj jest troche zdjec opisujacych nurtujacy mnie problem z przesyłaniem zdjęć z serwera do tagu img

Uzywam vue.js do frontendu i probuje wyswietlic zdjecia z bazy danych (mongoDb) na jednej z zakladek aplikacji.
Elementy img ladują zgodnie z iloscia zdjec przypisanych do uzytkowanika w bazie danych , ktora miesci sie w zbiorze mediafiles .Wszystko sciagnane jest przez request podczas cyklu  created() , a pozniej tagi ladowane sa dynamicznie poprzez v-for
 

<div v-for="(mediafile, index) in mediafiles" :key="index" class="thumbnailSlate">
  <div class="deleteRTG">
    <img src="../../../assets/orange donut.png" @click="deleteAfile(mediafile)" alt="">
    <img id="orangeCircle" src="../../../assets/orange-circle.png" @click="deleteAfile(mediafile)" alt="">
  </div>
  <img :src="'http://localhost:3000/public/'+mediafile" alt="" @click="openModal(mediafile)">
</div>

Niestety na stronie nie wyswietla sie zaden obraz tylko puste "div-y", wiec sie troche D(Z)IWIE :)
 

Zdjecie wsadzilem w folder "public" , zeby sprawdzic, czy sie w ogole sciaga, no i wychodzi na to, ze tak, bo w narzedziach > Network pokazuje mi je przy podgladzie
Wpisalem pierwszy lepszy url  z internetu do atrybutu src i wszystko hula:


Teraz cos ciekawego. Po ponownym zaladowaniu strony, zdjecie magicznie pojawia sie, gdzie powinno ( pewnie zostalo zapisane w cashu za pierwszym razem) - tak, to sa zeby po leczeniu kanałowym :)

Po wyczyszczeniu cashe, znowu pusty div. Tak, jak wczesniej pisalem, jestem bardzo poczatkujacy w temacie i licze na wyrozumialosc. Z gory dziekuje za pomoc

komentarz 14 czerwca 2018 przez rafal.budzis Szeryf (85,260 p.)
Radził bym ci jak najszybciej uciec z tego typu podejścia. Baza danych nie jest stworzona do przechowywania obrazków. Po obrazkach nie szukasz / nie sortujesz po plikach binarnych i nie robisz absolutnie nic co tłumaczyło by trzymanie tego w bazie. Najprostszym podejściem jest tworzenie plików graficznych z losowa nazwa a następnie w bazie danych trzymanie tylko nazwy pliku.

1 odpowiedź

0 głosów
odpowiedź 15 czerwca 2018 przez besthost Nowicjusz (200 p.)

Uzywam crypto na serwerze go generowania imion.
GridFs dla mongo dziala na bazie indexu imion - przynajmniej tak mi sie wydaje.
 

 file: (req, file) => {
      return new Promise((resolve, reject) => {
        crypto.randomBytes(20, (err, buf) => {     // generating unique names to avoid duplicates
          if (err) {
            return reject(err);
          }
          const filename = buf.toString('hex') + path.extname(file.originalname);
          const fileInfo = {
            filename: filename,
            bucketName: 'media',
            metadata: req.body.dateTaken
          };
          resolve(fileInfo);
        });
      });
    }

Rejestr nazw zdjec trzymam w polu "mediafiles" w dokumencie uzytkownika jako prosty zbior []

Udalo mi sie rozwiazac problem, przynajmniej na razie :)
Wykorzystalem do tego osobne life cycle hooks w vue.js

1. created()   // sciaga pliki z bazy do folderu public, zebym mogl podpiac "src" kazdego img jak w kodzie na poczatku postu (oddzielny request dla kazdego pliku). Vuex ma wczesniej wszystkie dane uzytkownika, w tym mediafles[] z nazwami zdjec

   created() {
        this.items = this.$store.state.StorePatient.visits;
        let files = this.$store.state.StorePatient.mediafiles; 
        if (files.length > 0) {
            for(let i=0;i< files.length;i++) { 
                let innerfiles = files;    
                visitAxios.post(`http://localhost:3000/client/visits/files/download/${files[i]}`)
                .then(res => { 
                    console.log('added file...');
                })
                .catch( err => console.error(err));
            }
        }else {
            return;
        }
    },


2.mouted() //  uaktualnia lokalna liste komponentu, zeby mogl wygenerowac div-y dzieki v-for

    mounted() {
        setTimeout(()=>{
        this.mediafiles = this.$store.state.StorePatient.mediafiles;
        }, 2000);


Dodalem setTimeout, zeby dac wiecej czasu na sciaganie zdjec na serwer zanim dojdzie do generowania listy na stronie, ale chyba jest zbedny, bo mimo asynchronicznosci axios.post(), funkcja created() nie przejdzie do mounted() poki wszystkiego nie skonczy - zgadza sie?

Natomiast wszystkie proby ze streamowaniem prosto do klienta typu readStream.pipe(writeStream) to totalna porazka. Nie moge tego jakos podpiac pod element img, probujac base64 encoding. Jeszcze nie ten lewel....
Moze ktos ma inny pomysl? Jakie sugestie? Dzieki!

Podobne pytania

0 głosów
0 odpowiedzi 72 wizyt
pytanie zadane 1 grudnia 2019 w Offtop przez msTps Nowicjusz (210 p.)
+1 głos
1 odpowiedź 220 wizyt
pytanie zadane 16 sierpnia 2017 w JavaScript przez szustka124 Gaduła (4,380 p.)
0 głosów
0 odpowiedzi 119 wizyt
pytanie zadane 31 października 2019 w JavaScript przez BT101 Stary wyjadacz (12,540 p.)

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...