learnMedlem sedan jan. 20051 130 inlägg Är detta en korrekt och fullständigt tillvägagångssätt att visa en bild mha ett php-script:
<img src="bild.php" />
header('Content-Type: image/jpg');
header('Content-Disposition: attachment; filename="Bild"');
readfile('bilder/bild.jpg');
Det finns ju en hel uppsjö med varianter, vad rekommenderas att skriva i headern?
Jag har upptäckt att bilden tar längre tid på sig att laddas än om jag bara skriver ut den på "vanligt sätt". Har det med cachen att göra kanske, lagras bilden i besökarens cache-minne med koden ovan?
sl0kMedlem sedan maj 2005562 inlägg ta bort raden med attachment så funkar det bättre sen ..
anledningen till att det tar längre tid är för att hela filen ska läsas genom php istället för att enbart länkas till..
learnMedlem sedan jan. 20051 130 inlägg Ok, menar du hela raden
header('Content-Disposition: attachment; filename="Bild"');
? Isf så får ju inte bilden ngt namn ("spara som")...
sl0kMedlem sedan maj 2005562 inlägg
learn skrev:
Ok, menar du hela raden
header('Content-Disposition: attachment; filename="Bild"');
? Isf så får ju inte bilden ngt namn ("spara som")...
Ok näe du hade rätt, har själv aldrig använt attachment så tidigare .. använd koden så som du hade. Det funkar.
learn skrev:
header('Content-Type: image/jpg');
header('Content-Disposition: attachment; filename="Bild"');
readfile('bilder/bild.jpg');
Vad som ska skrivas i headern beror på vad du vill göra. Ska du lägga adressen till PHP-filen i en img-tagg så rekommenderar jag denna kod:
<?PHP
header('Content-Type: image/jpeg');
header('Content-Disposition: inline; filename="bild0.jpg"');
header('Content-Length: ' . filesize('bilder/bild0.jpg'));
readfile('bilder/bild0.jpg');
?>
Huruvida man strikt måste skicka med Content-Length vet jag inte säkert, men det skadar itne iaf. I övrigt, några saker att tänka på:
- Content-Type för jpg-bilder är image/jpeg med e.
- I detta fall bör du använda Content-Disposition: Inline
- Se till att du inte råkar skicka med katalognamnet, utan bara själv fulnamnet i Content-Disposition. Content-Disposition: inline; filename="bilder/bild0.jpg" är alltså fel.
- Se till att du inte råkar få några extra tecken före eller efter <?PHP resp. ?>
learnMedlem sedan jan. 20051 130 inlägg OK, tackar!
Anledningen till att jag vill visa bilden mha php-scriptet är för att dölja sökvägen till bilden. Men jag kanske inte behöver dölja den eftersom mappen "bilder" ligger utanför rooten...då kan ju utomstående besökare ändå inte söka upp bilden på egen hand... Eller? Har jag förstått det hela rätt?? Isf kan jag ju skriva:
<img src="../bilder/bild.jpg" />
Eller är detta en "säker" och pålitlig metod??
Om bilderna ligger utanför roten, så går det inte att komma åt dem alls genom att bara skriva in en sökväg, (Varken i en img-tagg eller genom att skriva in adressen i adressfältet) utan du måste ta hjälp av t ex php.
Vad vill du uppnå? Skydda din bilder från nedladdning? Skyda mot hetlänkning? I båda fallen kan .htaccess kanske vara till hjälp.
learnMedlem sedan jan. 20051 130 inlägg Jag vill skydda bilderna från nedladdning. Hur använder jag .htaccess i detta fall? Tacksam för all hjälp jag kan få :)
sl0kMedlem sedan maj 2005562 inlägg Nej det kommer inte att fungera av den anledningen som du själv sa.
(/red angående ditt inlägg om du kunde använda <img src="../bilder/bild.jpg" />)
Jag antar att du kanske menade
<img src="bild.php?bild=../bilder/bild.jpg" />
Vilken antagligen kommer fungera om du läser in bildlänken från $_GET['bild'].
Dock får du vara försiktig med det här och göra vissa säkerhetskontroller av bla mapp, filändelse m.m så att folk inte försöker komma åt vilka filer som helst i ditt system.
ett ex kunde vara att ha
<?php
$bild_mapp = "../bilder/";
$bild = basename($_GET['bild']);
if (is_readable($bild_mapp.$bild)) {
$bildurl = $bild_mapp.$bild;
}
else {
$bildurl = "default_error.jpg"; // sökväg till defaultbild
}
header('Content-Type: image/jpeg');
header('Content-Disposition: inline; filename="$bild"');
header('Content-Length: ' . filesize($bildurl));
readfile($bildurl);
?>
Och sen länka dina bilder till
<img src="bild.php?bild=bild.jpg" />
/red typo
learn skrev:
Jag vill skydda bilderna från nedladdning. Hur använder jag .htaccess i detta fall? Tacksam för all hjälp jag kan få :)
På vilket sätt ska det skydda mot att jag högerklickar och väljer spara bild?
learnMedlem sedan jan. 20051 130 inlägg Jag menar att man inte skall kunna komma åt bilder på egen hand, tex genom att mata in dess adress i webbläsaren. Visar jag en bild så kan man naturligtvis spara ner bilden.
learnMedlem sedan jan. 20051 130 inlägg bild.php:
$bild_mapp = "../bilder/";
$bild = basename($_GET['bild']);
if (is_readable($bild_mapp.$bild)) {
$bildurl = $bild_mapp.$bild;
}
else {
$bildurl = "default_error.jpg"; // sökväg till defaultbild
}
header('Content-Type: image/jpeg');
header('Content-Disposition: inline; filename="$bild"');
header('Content-Length: ' . filesize($bildurl));
readfile($bildurl);
Funkar ju bra. Men hur säkert är det egentligen i enlighet med ovanstående kvalifikationer...?? Som jag ser är det ju bara för "boven" att själv inkluderar filen (https://www.minsida.com/bild.php?bild=hej.jpg) på sin egen sida... Kan jag förhindra detta på ngt sätt?? :q
learnMedlem sedan jan. 20051 130 inlägg Att använda $_SERVER['HTTP_REFERER'] för att kontrollera att bilden hämtas från min sajt är väl inte helt säkert?
Kanske jag kan ancända mig av .htaccess-filen, men hur ska jag skriva min RewriteCond för detta?
learnMedlem sedan jan. 20051 130 inlägg Om jag i min .htaccess skriver:
RewriteEngine on
RewriteCond HTTP_REFERER } !^$
RewriteCond HTTP_REFERER } !^http://minsida.com/.*$ [NC]
RewriteCond HTTP_REFERER } !^http://www.minsida.com/.*$ [NC]
RewriteRule ^(.*)$ [url]http://www.minsida.com/felsida[/url] [R]
Borde det räcka? Eller går det att ta sig förbi...?
Tack på förhand
sl0kMedlem sedan maj 2005562 inlägg Du kan ju på sidan som du länkar till dina bilder slumpa fram en sträng.. som endast är giltig i ca 5min ..
O sen i bild.php testar så att korrekt sträng är angiven ..
learnMedlem sedan jan. 20051 130 inlägg Okej, låter smart. Hur exakt då menar du, kan du visa med ett exempel? Tack
sl0kMedlem sedan maj 2005562 inlägg Ett rätt simpelt ex är att dölja en timestamp i länken.. här kan du själv klura ut en algoritm för att gömma den väl men samtidigt enkelt kunna få tillbaka den.
Här är ett ex där timestamp noteras hexadecimalt.
// sidan där du skriver ut länkarna till bilderna
$tiden = sprintf('%x', time());
echo "<img src=\"bild.php?bild=$din_bild_url&t=$tiden\" />";
o sen i bild.php
// test if valid t
if (!isset($_GET['t'])) {
$bildurl = $bild = "no_hotlink_allowed.jpg";
}
else {
$t = $_GET['t'];
$time_diff = time() - hexdec($t);
if ($time_diff > 60*5) { // antal sekunder 60*5 = 5min
$bildurl = $bild = "no_hotlink_allowed.jpg";
}
else {
$bild_mapp = "../bilder/";
$bild = basename($_GET['bild']);
if (is_readable($bild_mapp.$bild)) {
$bildurl = $bild_mapp.$bild;
}
else {
$bildurl = "default_error.jpg"; // sökväg till defaultbild
}
}
}
header('Content-Type: image/jpeg');
header('Content-Disposition: inline; filename="$bild"');
header('Content-Length: ' . filesize($bildurl));
readfile($bildurl);
/red typos o mindre justeringar ...