Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kuvat tietokantaan

Sivun loppuun

pojedo [21.11.2016 04:41:28]

#

Olen ajatellut, että tekisi kuville ja tiedostoille oman taulun. Taulun nimi voisi olla 'files'.
Taulu olisi rakenteeltaan joku tämänkaltainen: id, name, file_id file_name, date...

Tässä tarkennuksena 'files'.
id: 107
name: Kuva Rottweiler
file_id: 7262
file_name: kuva.jpg
date: 2016-11-21 04:41:20

Toinen taulu 'sivu'.
id: 8229
nimi: Rottweiler
kuva: 7262

Tässä siis haluasin files taulusta sivu tauluun tiedoston id:n. Ei tarvitsi muokata joka riville erikseen muuttunutta kuva.jpg tiedoston nimeä. Voisiko joku tehdä sql-tiedoston tähän siitä miten tämä tehdään?

The Alchemist [21.11.2016 10:21:47]

#

Tuossahan se on sulla jo tehtynä: sivu-taulussa on kenttä "kuva" ja sillä on arvona 7262. Kysymyksestäsi ei selviä kyllä alkuunkaan, että mikä on ongelma ja mihin tarvitset apua. Kenttä itsessään ei vaadi mitään kikkailua: ainoa vaatimus on se, että tietotyyppi on sama kuin viitattavassa taulussa. Jos tiedostojen taulussa id-kenttä on integer, niin viittauksen säilövän kentän tyypin tulee olla integer jne. Tai ei sekään ehdoton pakko ole, mutta vierasavainta ei voi luoda kahden erityyppisen kentän välille.

Metabolix [21.11.2016 17:30:49]

#

Jos tuon kuvauksen muuttaminen SQL:ksi on jotenkin hankalaa, olisi varmaan syytä lukea opas SQL:stä. Ei se ohjelmointi voi niin toimia, että joka ongelmaan pyydetään valmista koodia.

Eli: Millaisella SQL-kyselyllä olet yrittänyt? Mikä virhe tulee? Mistä itse arvelet virheen johtuvan? Miten olet yrittänyt korjata virhettä?

pojedo [21.11.2016 23:28:47]

#

Tein muutamassa minuutissa tämän taulun, jonka toiminnasta en vielä tiedä.

CREATE TABLE `files` (
    `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `name` TEXT NOT NULL,
    `file_id` INT NOT NULL,
    `file_name` TEXT NOT NULL,
    `date` TIMESTAMP NOT NULL DEFAULT current_timestamp,
) ENGINE=InnoDB;

CREATE TABLE `sivu` (
    `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `nimi` TEXT NOT NULL,
    `kuva` INT NOT NULL,
    FOREIGN KEY (kuva) REFERENCES files (file_id)
) ENGINE=InnoDB;

INSERT INTO `files` (`id`, `name`, `file_id`, `file_name`, `date`) VALUES
(1, 'Koira', '1234', 'koira.jpg', '2016-11-21 04:41:20'),
(2, 'Kissa', '4321', 'kissa.jpg', '2016-11-21 23:05:17'),
(3, 'Vuohi', '2345', 'vuohi.jpg', '2016-11-21 23:10:14');

INSERT INTO `sivu` (`id`, `nimi`, `kuva`) VALUES
(1, 'Koirasta Kuva', '1234'),
(2, 'Kissasta kuva', '4321');

En tiedä onko tämä järkevin tapa tämä tehdä?
files-taulu on kuvagalleria ja sieltä sivulle kuva. Sitä mietin, että tuoko kuvan tiedoston nimen (koira.jpg) koirasta sivu-tauluun 1234 kohtaan?

Grez [22.11.2016 00:55:30]

#

Mikä toi file_id oikeen on? Onko sulla joku kolmas taulu, missä ne muodostuu vai miten? Siis tämä 1234, 4321 ja 2345.

groovyb [22.11.2016 11:47:41]

#

Onko myös jokin syy, miksi et tallenna kuvan/tiedoston binääriä ja content typeä tuohon samaan riviin, ja streamaa sitä sieltä suoraan kun halutaan käyttää?

The Alchemist [22.11.2016 12:08:12]

#

Mikä järki siinä nyt olisi, että ajetaan kuvan data php:n ja myskylän läpi, kun sen voi lukea suoraan levyltä Apachen/Nginxin/etc avulla? Lukuisten eri prosessien läpi pipettäminen ei kuulosta kovin "suoralta", ei todellakaan. Luulisi sen vähentävän tarpeetonta palvelimen rasitustakin, että laitetaan filut johonkin hakemistoon, josta www-palvelin tarjoilee ne kansalle. Usein kuvista tarvitaan myös kasa erikokoisia thumbnaileja ja niillekin pitäisi vielä kirjoittaa koodia turhan päiten...

groovyb [22.11.2016 16:24:09]

#

riippuu melkoisesti käyttötarkoituksesta ja volyymistä. Usein tiedostokama on pakattuna tietokannassa, josta se streamataan ulos purun jälkeen. Yleisesti, on parempi keskittää kama yhteen paikkaan, oli se sitte DB tai levynkulma. ja jos DB on jo käytössä, miksei käyttäisi sitä?

Ja miten se kasvattaa palvelimen rasitusta? Jos toinen vaihtoehto on että ensin luetaan tietokannasta filun tiedot, ja sen jälkeen metsästetään levyn kulmalta?
Eipä tuo nyt hirveän raskasta ole suoran streamin palauttaminen kannasta, muotokin on jo valmiiksi oikea. läimäsee vaan content typen ja streamaa ulos.

Oletetaan nyt, että olisi erillinen stream -piste vaikka kuville. C#:lla se menisi aika lähelle näin:

[OutputCache(CacheProfile = "WebImages")] //Tämä cachea varten
public async Task<ActionResult> PalautaKuva(int id)
{
   var svc = new JokuKuvaService();
   var kuva = await svc.HaeKuva(id);
   if(kuva != null)
     return File(kuva.kuva, "image/" + kuva.tiedostopaate, kuva.tiedostonimi);
   else
     return new HttpNotFoundResult("Kuvaa ei löydy");
}

qeijo [23.11.2016 16:34:30]

#

Pseudokoodi:

$tyng->bilde->in :| i->database


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta