Miten saan ladattua käyttäjän näkyville kuvan tai muun tiedoston, joka on public_html kansion alapuolella.
Olen etsinyt googlen kautta, asiasta tietoa. Hyviä opastuksia on löytynytkin, muttei niin hyviä, että olisi minun jakeluuni mennyt. Siksi kerran nojaan tänne teidän oppeihinne. Kiitos!
PHP:n readfile()?
Readfile-funktion tilalla kannattaa käyttää X-Sendfile:ä tai vastaavaa headeria, mikäli palvelin sellaista tukee.
Kyllä, oikeassa olet ajv. Saan readfile(); functiolla ladattua kuvan hienosti ;)
Otsikkoni, antaa taas kerran väärän kuvan. Periaatteessa haluan ladata kuvan, mutta haluan saada sen esiin verkkosivuille, en ladata sitä sivuilta mihinkään. Suuntani on oikea, readfile(); funktion avulla, mutta miten saan kuvan niin, että voin sijoittaa sen <img> tagin sisään.
$file = '/var/www/domain/uploads/kuva.jpg'; DownloadFile($file); function DownloadFile($file) { // $file = include path if(file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); exit; } }
Otsikossa Content-Type täytyy yleensä kertoa kuvan MIME-tyyppi, esim. image/png tai image/jpeg. Lisäksi voisit poistaa kohdat Content-Description, Content-Disposition, Content-Transfer-Encoding, ob_clean ja flush.
Jos itse img-tagissa oli jotain selvää, kerrataan sekin: laitat vain img-tagin src-attribuuttiin tuon PHP-skriptin osoitteen, aivan kuten laittaisit minkä tahansa tavallisen kuvan osoitteen.
Voi kiitos Metabolix!
img-tagissa ei ollut epäselvää, mutta hyvä kun varmistit.
Pitäisi saada kuvia, niin paljon kuin käyttäjä on syöttänyt kansioon perättäisenä listana näkyviin. Tällä hetkellä kuvista tulee näkyviin yksi, ja se valtaa koko ruudun. (Yksi kuva, mustalla taustalla).
Pahoitteluni, usean päivän olen yrittänyt ratkaista ongelmaani. Siinä kuitenkaan onnistumatta, eli joudun palaamaan tänne apuanne pyytämään.
blaa blaa blaa... while($r = mysql_fetch_assoc($t)) { $picture = htmlspecialchars($r['picture']); print '<div id="div">'; picture($picture); print '</div>'; } blaa blaa blaa... function picture($picture) { $file = dirname($_SERVER['DOCUMENT_ROOT']) .'/kuvat_folders/thumbs/'.$picture; // $ending = Tämä tarkistetaan kuvan päätteestä. arvo on = .jpg, .gif yms. if(file_exists($file)) { header("Content-Type: image/$ending"); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); // Ilman näitä tulee contains error ob_clean(); flush(); readfile($file); } // Tämä ei näy "kuvana" sivuilla, vaan aukeaa yhtenä isona kuvana ruudulle. Tulisi saada lista kuvista näkyviin, silmukan mukaisesti. print '<a href="'.$file.'" rel="lightbox" title=""><img src="'.$file.'" width="30px"></a>'; }
No ihme että tuurilla edes tulee näkyviin.
Sun pitäis generoida sivu jossa on img -tageja joissa on viittaus vaikkapa toiseen skriptiin joka sitten antaa kuvia yksi kerrallaan.
Eli html-sivulla kuvat on tyypillisesti <img src="osoite" alt="jotain" /> ,ei niin että se kuvan data vaan tuupattaisiin keskelle sivua.
Hmm...
Metabolix kirjoitti:
Laitat vain img-tagin src-attribuuttiin tuon PHP-skriptin osoitteen, aivan kuten laittaisit minkä tahansa tavallisen kuvan osoitteen.
manninen kirjoitti:
img-tagissa ei ollut epäselvää, mutta hyvä kun varmistit.
manninen kirjoitti:
Miten näin pääsi käymään? Onko $file mielestäsi nyt sellainen, kuin pitää?
Siis src-attribuutissa pitäisi olla esimerkiksi kuva.php?kuvan_id=123
, ja kuva.php:n pitäisi sitten tuottaa yksi kuva.
Ups!
Kiitos Metabolix, ja Grez! Nyt toimii kuten kuuluukin ;)
Koitan ladata samalla logiikalla .pdf- docx yms. tekstitiedostoja, onnistuneesti lukuun ottaen seuraavaa ongelmaa.
- Jos tiedoston nimessä on väli, loppuu tiedoston luku siihen.
Korvaanko tiedoston nimessä olevat välit esim. viivoilla, vai onko ongelmaan parempaa ratkaisua?
Välit eivät ole este, vaan koodissasi on jokin puute. Vaikea nyt sanoa tarkemmin näkemättä ”samalla logiikalla” toimivaa koodiasi, mutta tarkista, että tiedostonimet enkoodataan eri tilanteissa oikein, esim. linkeissä (raw)urlencode ja Content-Disposition-otsikossa (jos käytät) ilmeisesti myöskin sama.
Kiitos, Metabolix!
Juuri tuo rawurlencode, puuttui minulta ja nyt toimii.
Aihe on jo aika vanha, joten et voi enää vastata siihen.