Kliknite tukaj, da si ogledate profil, kot ga vidijo drugi

Shranjevanje slike preko povezave v PHP

Delite vsebino na Facebooku
Delite vsebino na Twitterju
  S pomočjo PHP lahko naredimo povezavo, ki bo ob kliku nanjo avtomatsko ponudila prenos slike na disk uporabnika.
 
 
1
 
 

Če gradite uporabniško prijazno spletno stran, potem lahko ustvarite posebno povezavo, kjer bo brskalnik ob kliku nanjo ponudil okno za prenos slike na računalnik uporabnika oz. jo že avtomatsko shranil.

Povezava bo v obliki get.php?img=ime_slike.jpg

V ta namen bomo pripravili PHP skripto, ki kot parameter sprejme ime slike ter vrne sliko brskalniku skupaj z navodilom, da je slika namenjena za shranjevanje.

 
 
2
 
 

Najprej ime slike shranimo v lokano spremenljivko.

$img = $_GET['img'];

 
 
3
 
 

if(!empty($img))
{
   if (strpos($img,'slike')===false && strpos($img,'images')===false)
   {
       header("HTTP/1.0 404 Not Found");
       exit;
   }

Nato preverimo, da je bila slika res podana kot parameter.

Zaradi varnosti s pomočjo funkcije strpos še dodatno preverimo, da se zahtevana slika nahaja v mapi slike ali images.

 
 
4
 
 

$filename = $_GET['img'];
$size = @getimagesize($filename);
$fp = @fopen($filename, "rb");


Zaradi dodatnega varnostnega preverjanja s pomočjo getimagesize preverimo velikost slike ter jo s funkcijo fopen odpremo za branje.

 
 
5
 
 

if ($size && $fp)
   {
      header("Content-type: {$size['mime']}");
      header("Content-Length: " . filesize($filename));
      header("Content-Disposition: attachment; filename=$filename");
      header('Content-Transfer-Encoding: binary');
      header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
      fpassthru($fp);
      exit;
}


V primeru, da je velikost slike večja od nič in da smo sliko lahko odprli, s pomočjo funkcije header nastavimo navodilo brskalniku, da je datoteka namenjena shranjevanje ter s funkcijo passtrhu vrnemo sliko.

 

 
 
6
 
 

Če bo uporabnik sedaj kliknil našo povezavo oblike get.php?img=ime_slike.jpg, se bo prikazalo okno za prenos slike ali pa se bo slika že avtomatsko shranila na disk uporabnika.

 

Zaradi boljše preglednosti pa spodaj podajam še celotno kodo programa:


$img = $_GET['img'];


if(!empty($img))
{
   if (strpos($img,'slike')===false && strpos($img,'images')===false)
   {
       header("HTTP/1.0 404 Not Found");
       exit;
   }
   $filename = $_GET['img'];
   $size = @getimagesize($filename);
   $fp = @fopen($filename, "rb");
   if ($size && $fp)
   {
      header("Content-type: {$size['mime']}");
      header("Content-Length: " . filesize($filename));
      header("Content-Disposition: attachment; filename=$filename");
      header('Content-Transfer-Encoding: binary');
      header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
      fpassthru($fp);
      exit;
   }
}

?>

 
 
Komentiraj
 
 
 
 
 
8.6.2014, 0:37
Koda je nevarna, ker lahko z uporabo relativne poti prenese uporabnik slike iz poljubne mape strežnika. Primer:

s l i k e . p h p ? i m g = i m a g e s / . . / . . / . . / . . / m a p a / t e s t . j p g


spremenjeno: kljuka (8.6.2014, 0:38)
 
 
 
 
21.7.2015, 15:30
A je lahko tudi za druge datoteke in ne samo za slike?
 
 
 
 
21.7.2015, 15:36
Imam pa težavo. Ko napišem get.php?img=posta.gif mi napiše

$ Img = $ _GET ['img']; if (! empty ($ img)) {if (strpos ($ IMG, 'slike') === lažnimi && strpos ($ img, "slike") === false) {header ("HTTP / 1.0 404 Not Found "); izhod; } $ Filename = $ _GET ['img']; $ Size =getimagesize ($ filename); $ Fp =fopen ($ filename "rb"); if ($ velikost && $ fp) {header ("Content-type: {$ velikost ['mime']}"); header (. "Content-Length:" velikost datoteke ($ filename)); header ("Content-Disposition: navezanost; filename = $ filename"); header ("Content-Transfer-Encoding: binarno"); header ("Cache-Control: must-ponovne potrditve, post-check = 0, pre-check = 0); fpassthru ($ fp); izhod; }}?>
 
 
 
 
8.8.2015, 15:58
Imam tri vprašani:
1. Ali mora biti slika NUJNO .JPG?
2. Ali mora biti ta datoteka v mapi images?
3. Ali se lahko prenašajo tudi druge datoteke (še vedno nisem dobil odgovora)?
 
 
 
 
8.8.2015, 23:09
Zakaj ne preveris tega sam, glede na tvoja vprasanja se to takoj preizkusi? Tako se najvec naucis
 
Prijava in registracija
 
 
 
Zmaga.com ponuja brezplačno in razumljivo učenje računalniških programov, vas na enkraten način spozna z različnimi svetovnimi jeziki, s podrobno obrazloženimi recepti prikaže čare kulinarike in vam prežene strahove pred domačimi opravili.
 
 
Poleg tega lahko prebirate poučne članke, ki so namenjene širjenju naše splošne razgledanosti ter preverite svoje znanje z priljubljenim in enostavnim sistemom za preverjanje znanja. Če med vsebinami, ki se dodajajo vsak dan, ne najdete želenega znanja, je za vaša vprašanja na voljo dobro obiskan forum, kjer lahko tudi aktivno sodelujete. V primeru, da bi radi svoje praktično znanje delili z ostalimi, pa to lahko storite preko preprostega vmesnika za dodajanje vsebin. Zmagajte z znanjem z Zmaga.com!