Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: content-type ongelma

Sivun loppuun

Toshiba [13.04.2008 20:04:26]

#

Tervehdys,

Haen kuvan kannasta blobbina ja se tulostuu ihan oikein, kunhan vaan koodi on puhdasta php:tä. Ongelma on siinä, etten enää saa kuvaa näytölle, kun olen vaihtanut => header("Content-Type: image/jpg); . Lisäksi sama ongelma esiintyy jos kyseinen koodi on html-kielen seassa.

Olen yrittänyt vaihtaa content-typea text/html ilman tulosta. Osaisiko joku viisaampi auttaa ongelmaan?

ajv [13.04.2008 20:10:06]

#

Hmm... Vähän epäselvä ongelma (kuten on tämä vastauskin). Määrittele "puhdas php". Mitä olet vaihtanut => header("Content-Type: image/jpg); (sulkeva lainausmerkki puuttuu btw).

"Kyseinen koodi html.kielen seassa". Hieman tarkennusta. Yrität tulostaa sitä kuvan binääri-dataa html-sivuun?

Koodia peliin, niin päästään kaikki helpoimmalla :)

Toshiba [13.04.2008 20:21:31]

#

Koska koko koodia oli mahdoton repiä niin tein esimerkin siitä missä sen ns. kohdassa sen pitäisi toimia. Tietysti olen alussa määrieltyä meta tietoa koettanut jäättää pois tuloksetta. Näyttäisi vähän siltä, että jos selain päättää alkaa lukemaan jotain content typea, niin sen päätä ei enää käännetä :P

Eli tosiaan kun nakkaan kaikki html-tagit pois niin koodi toimii, mutta ongelma on se, että niiden pitäisi ns. olla siinä, koska kuvan pitäisi tulostua kannasta asiakkaan jättämän ilmoituksen yläpuolelle.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" href="styles.css" type="text/css">
<title>otsikko</title>
</head>
<body>
<?php
// Muodostetaan yhteys MySQL-tietokantapalvelimeen
// halutuin tunnuksin
$link = mysql_connect("localhost", "jotain", "jotain")
or die("Tietokannan: " . mysql_error());
if (!$link)
{
	echo ("Tietokannan avaamisessa tapahtui virhe.\n" . mysql_error());
	exit;
}
.
.
.
.
header("Content-Type: image/jpg jpeg jpe");
print $tulosrivi['Kuva'];
?>
</body>
</html>

Mod. lisäsi kooditagit

Teuro [13.04.2008 20:38:44]

#

Miksi minusta tuntuu, että tuosta pastesta puuttuu jotakin oleellista? Mitä on muuttujassa $tulosrivi['kuva']? Onko siinä kuvan binaaridata vai kuvan osoite palvelimella?

Toshiba [13.04.2008 20:42:15]

#

Teuro: ihan binaaridataa tietokannasta ja tosiaan .... on välissä, koska en jaksa pastettaa koko koodia. Ja tosiaan toi binaaridatana tuleva kuva tulostuu ihan oikein, ilman html tageja.

Teuro [13.04.2008 20:45:15]

#

Ennen headereita ei saa tulostaa mitään muuten ei toimi, siksi saattaa olla ettei toimi html tagien kanssa ne kai tulkitaan tulostukseksi. Minkälainen homma olisi tallentaa kantaa linkki kuvaan? Toimisi ehkä paremmin ja ei olisi tarvetta muutella headereilla kesken kaiken.

Toshiba [13.04.2008 20:50:46]

#

Ideana tosiaan on se, että kuvat ovat tietokannassa binaarina, niin linkki kuvaan ei toimi sen takia. Mietin vaan, että miksi sitten kuvia tallennetaan blobbina kantaan, jos niitä ei oikein voi käyttää sieltä kunnolla..? Paremmassa järjestyksessä ne kannassa tässä tapauksessa pysyisivät ja varmuuskopioiden ottaminen olisi todella näppärää. Varmasti näitä tietokanta toteutuksia käytetään paljonkin, en vaan pääse tästä nyt yhtään etiä päin!

Teuro [13.04.2008 20:57:28]

#

Mulla on ainakin tehty tuolla linkkimetodilla, eikä se varmuuskopiointi ole sen hankalampaa. Fiksulla kansiorakenteella kuvat ovat ihan hyvin järjestyksessä, ilman tietokantaakin. Voisikohan ne kuvat piirtää tavallaan bufferiin, josta ne asetellaan paikalleen?

Toshiba [13.04.2008 21:09:04]

#

Teuro: muuten kyllä, mutta lomakkeet nyt tallentavat jo kantaan suoraan kuvia, niin en laiskuuttani jaksa alkaa tauluja / lomakkeita muuttelemaan :)

Mietin kanssa vähän vastaavaa kuin bufferia ja yrittäisi sitä tulostaa jotenkin echo <img src... avulla?

ajv [13.04.2008 21:14:17]

#

Toshiba kirjoitti:

Mietin kanssa vähän vastaavaa kuin bufferia ja yrittäisi sitä tulostaa jotenkin echo <img src... avulla?

Itse asiassa se kuva on pakko tulostaa sinne html-sivulle img-tagilla. Ei selain sitä binäärimössöä sieltä html-sivusta osaa kaivaa.

Eli <img scr="naytakuva.php?kuva=asdf.jpg" alt="" />
ja sitten tuolla naytakuva.php:ssä haet sen binäärin sieltä kannasta ja tulostat.

Toshiba [13.04.2008 21:16:45]

#

Ok, kiitoksia avusta! Pitääkin yrittää aiheesta löytää joku sopiva tutorial, missä tehdään vähä vastaavaa... :)

Tosiaan sain tosiaan ratkaistua ton ongelman vastaavalla kuin yllä kirjoitit, eli kirjoittaa vaan sinne html koodin img tagin sekaan sen php tiedoston joka lataa niitä kuvia. Vaikuttaa sinäänsä ihmeelliseltä että toimii näin, mutta mikäs siinä!

Olisi vaan pitänyt katsella tätä foorumia hieman aikeisemmin niin olisi ratkaisu löytynyt nopiampaa! Mutta kiitoksia kaikille avusta!

ajv [13.04.2008 23:16:26]

#

Tein tuosta pikaisesti omiin pöytälaatikosta löytyviin koodeihin perustuvan koodivinkin.

Merri [14.04.2008 07:50:18]

#

Toshiba: keventääksesi tietokantapalvelimen taakkaa, niin näpäytä myös pitkäaikainen cache sille kuvalle, niin selaimen ei tarvitse jaella sitä aina uudelleen. Muitakin header-tietoja kannattaa kuvasta antaa (muokkauspäivä jne.)

Yleensähän kuvia ei tungeta tietokantaan ihan sen takia, että se on "turhaa" ylimääräistä kuormaa tietokannalle, tiedostojärjestelmästä tarjoiltuna kuvat tulevat paljon nopeammin/keveämmin.

(Muita ihmettelyn aiheita on sitten lähinnä XHTML Transitionalin käyttö. Näytekoodi ei ole validia XHTML:ää eikä hyvinmuotoiltua XML:ää, ja Transitionalia ei ole tarvetta käyttää uusilla sivuilla.)

Toshiba [17.04.2008 14:38:33]

#

Itse väittiäsin etteivät kuvat ole ylimäärästä kuormaa kannalle, jos ne on esim erillisissä tauluissa, muun käytettävän datan kanssa. Lisäksi näitä kuvia tulee n. 5kpl näytettäväksi per sivu, eikä niitä lataamisen jälkeen enää muokata.

Tietysti tähän erilliseen tauluun menee esim. kuvan formaatti, blobbina moska jne.

Sehän on ihan hakuehdoista / indekseistä kiinni, miten nopeasti kuvat haetaa, enkä todellakaan pelaille millään [select *from jotain] ja koska kuvat eivät edes ole mitään isoja, mitä kannasta löytyy, niin tuskin tulee ongelmia.

Enempi ongelmia tähän tapaukseen olisi tullut pähkäilyt tiedostojärjestelmien kanssa + kuvan käyttöoikeudet ja jne. Paljon helpompi on käyttöoikeudet ja tunnistaa kuvalle lataaja on tietokannan avulla, esim kuva_id:n perusteella.

Ja jos ihmettelet XHTML Transitionalin käytöstä, niin kuten ylhäällä lukee, niin kyseessä on esimerkkipätkä ja nämä kyseiset tagit on generoitu ihan Macromedian Dreamweaverilla!

ajv [17.04.2008 15:31:56]

#

Toshiba kirjoitti:

Itse väittiäsin etteivät kuvat ole ylimäärästä kuormaa kannalle, jos ne on esim erillisissä tauluissa, muun käytettävän datan kanssa. Lisäksi näitä kuvia tulee n. 5kpl näytettäväksi per sivu, eikä niitä lataamisen jälkeen enää muokata.

Ei tuo tietokannan kuormaa vähennä, jos ne kuvat ovat omassa taulussaan. Oma tietokantapalvelin vähentäisi.

Toshiba kirjoitti:

Sehän on ihan hakuehdoista / indekseistä kiinni, miten nopeasti kuvat haetaa, enkä todellakaan pelaille millään [select *from jotain] ja koska kuvat eivät edes ole mitään isoja, mitä kannasta löytyy, niin tuskin tulee ongelmia.

Merri ei tainnut tarkoittaa kuormittamisella sitä, että sen rivin etsiminen sieltä kannasta olisi raskasta, vaan sitä, että tietokanta joutuu lukemaan sen binääridatan muistiin ennen tuuppaamista asiakassovellukselle (=PHP). Samoin PHP joutuu hakemaan tämän muistiin, ennen sylkäisemistä puskuriin lopulliselle asiakkaalle.

Toshiba kirjoitti:

Enempi ongelmia tähän tapaukseen olisi tullut pähkäilyt tiedostojärjestelmien kanssa + kuvan käyttöoikeudet ja jne. Paljon helpompi on käyttöoikeudet ja tunnistaa kuvalle lataaja on tietokannan avulla, esim kuva_id:n perusteella.

Tässä olen samaa mieltä.

Kuvan tietokantaan tallentamisessa on omat hyvät ja huonot puolensa. Päivitin koodivinkkiin vähän teoriaa.

Toshiba [17.04.2008 16:17:14]

#

Niin no siis tässä tapauksessa kuormitus on n. 5 kuvaa maksimissaan per sivu, joiden koko on erittäin pieni. En edelleenkään tajua miksi pitäisi tulla ongelmia kuormituksen suhteen, jos sitä binääridataa haetaan kerralla pieniä osia ja vain muutama kerta! :)

Kai tästä joku älykkö voi laskea eron toteutuksien välillä missä haetaan n. 100 kuvaa kerralla ja joiden koko on n. mt tai toisen ääripään jossa haetaan n. 5kpl kuvia joiden maksimikoko on 0,2 mt.

Tässä ehkä se pointtini oli. En itse näe mitään ongelmaa tässä suhteessa, ellei sitten kyseessä ole sivusto, jonka tietokanta on jo valmiiksi tukossa :)

ajv [17.04.2008 16:31:32]

#

Juu, en epäile, että ongelmia tulisi. Muistan lukeneeni, että nopeuden kannalta ei ole mitään merkitystä haetaanko kuva kannasta vai levyltä. Kuitenkin siinä vaiheessa, kun tietokanta huutaa viimeisiään (kuten joissakin webbihotelleissa), tuo kuvien hakeminen sieltä ei ainakaan helpota asiaa. Kannattaa muistaa, että sen pienen kuvankin hakeminen kannasta tavuina mitattuna on kutakuikin sama SELECT * FROM pikkutaulu.


Sivun alkuun

Vastaus

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

Tietoa sivustosta