56
Rad sa fajlovima Dr Nenad Kojić, dipl. inž. Milena Vesić, spec .stuk.inž. Danijela Nikitin, spec .stuk.inž. Školska 2017/18. Nikola Mihajlović, spec .stuk.inž. Luka Lukić, struk. inž. Visoka škola strukovnih studija za informacione i komunikacione tehnologije

Rad sa fajlovimaRad sa fajlovima Dr Nenad .RMLü , dipl. LQå . Milena 9HVLü , spec . VWXN LQå . Danijela Nikitin, spec . VWXN LQå . âNROVND 2017/18. Nikola 0LKDMORYLü , spec

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Rad sa fajlovima

Dr Nenad Kojić, dipl. inž. Milena Vesić, spec .stuk.inž.

Danijela Nikitin, spec .stuk.inž.

Školska 2017/18. Nikola Mihajlović, spec .stuk.inž.

Luka Lukić, struk. inž.

Visoka škola strukovnih studija za informacione

i komunikacione tehnologije

Preduslovi Ukoliko se želi fajl proslediti od korisnika do servera, putem web

forme, potrebno je u tag form dodati atribut enctype=" "

Vrednost ovog atributa treba podesiti na

enctype="multipart/form-data"

Podrazumevana vrednost ovog atributa je "application/x-www-form-urlencoded" i podrazumeva da se svi karakteri koji se prenose koduju.

Kodovanje se vrši konverzijom karaktera u ASCII HEX vrednosti

Kod vrednosti multipart/form-data nema konverzije pa se podaci prenose u originalu

Atribut enctype= " " se koristi samo kada se kao metod za slanje definiše POST

Samim tim, prilikom upload-a fajlova, limit koji dolazi sa upotrebom POST metoda se prenosi na veličinu fajla koji se upload-uje (8MB)

Preduslovi Ako se pokuša upload većeg fajla od 8MB (8388608) dobiće se greška

slična prikazanoj:

Ako se upload-uje fajl koji ima veličinu veću od 2MB, a manju od 8MB, POST neće unositi ograničenje, ali najčešće web server hoće

Ovo znači da je serversko ograničenje u konfiguraciji PHP-a takvo da unosi svoj maksimalni limit za prihvatanje upload-ovanih fajlova

Ovaj parametar se podešava u fajlu php.ini, u folderu php, u xampp-u i po potrebi se može promeniti.

Warning: POST Content-Length of 10725948 bytes exceeds the limit of 8388608 bytes

in Unknown on line 0

Klijentska strana

Kao zaključak se izvodi da se na klijentskoj strani koja želi korisniku da omogući upload fajlova na server, upotrebom web forme, mora definisati bar jedno polje tipa file, taster tipa submit i atribut enctype.

Pored ovih elemenata forme mogu se pojaviti i drugi u proizvoljnom redosledu i količini

Primer forme

Serverska strana

Web server dobija uploadovani fajl i po pravilu ga smešta u privremeni folder koji je konfiguracijom servera izabran

Ovaj folder je zajednički za sve fajlove koji svi korisnici uploaduju na sajtove hostovane na tom web serveru

Zato je bitno da se odmah nakon prenosa fajla od korisnika na web servere, u privremeni folder, željeni fajl fizički premesti u prostor koji je hostingom dodeljen konkretnom web sajtu i tu trajno skladišti

U xampp-u, ovo se nalazi u php.ini fajlu kao deo:

; Temporary directory for HTTP uploaded files (will use system default if not

; specified).

; http://php.net/upload-tmp-dir

upload_tmp_dir = "\xampp\tmp"

PHP kod

Nakon upload-a fajla, od klijenta na web server, HTTP je svoj deo posla u smislu prenosa fajla završio, kao i web server koji je taj fajl privremeno snimio na privremenu lokaciju na serveru

Da bi programer imao pristup uploadovanom fajlu, koristi se superglobalna promenljiva $_FILES

Ovom promenljivom se omogućava pristup podacima o upload-ovanom fajlu

Kao i kod upotrebe $_POST ili $_GET superglobalnih promenljivih, sintaksa upotrebe $_FILES za pristup prenetom fajlu, čiji je name atribut npr.

<input name="userfile" type="file" id="userfile" />

je

$_FILES['userfile']

$_FILES

Za razliku od $_POST ili $_GET, kojima se dobija poslati string, superglobalna promenljiva $_FILES ima više podataka koji opisuju fajl (ime, tip, veličinu,…) pa kako je sama niz, a u sebi ima niz, to je multidimenzionalni niz

Indeksi niza u ovoj superglobalnoj promenljivoj su unapred definisani, i to su: name, tmp_name, size, type i error

U ovim elementima niza se nalaze podaci o upload-ovanom fajlu i to: njegovo ime sa ekstenzijom, putanja do mesta gde je privremeno smešten na web server, veličina u bajtima, tipa fajla i informacija o grešci, ako se greška desila

Njihovim vrednostima se tako pristupa pomoću

$fileName = $_FILES['userfile']['name'];

$tmpName = $_FILES['userfile']['tmp_name'];

$fileSize = $_FILES['userfile']['size'];

$fileType = $_FILES['userfile']['type'];

$fileError = $_FILES['userfile']['error'];

$_FILES

Tako za polje forme čiji je name bio userfile, PHP kodom pristupamo i dobijamo informacije o upload-ovanom fajlu, u lokalne promenljive PHP-a

U ovom slučaju to su promenljive $fileName, $tmpName, $fileSize, $fileType i $fileError

Polje za error vraća 1 ako greška postoji Imena ovih promenljivih su proizvoljna

$fileName = $_FILES['userfile']['name'];

$tmpName = $_FILES['userfile']['tmp_name'];

$fileSize = $_FILES['userfile']['size'];

$fileType = $_FILES['userfile']['type'];

$fileError = $_FILES['userfile']['error'];

klijent + server

fajlovi.php

Premeštanje fajla

Nakon upload-a fajl se nalazi na privremenoj lokaciji na serveru

Putanja do te lokacije se kodom dobija pomoću

$tmpName = $_FILES['userfile']['tmp_name'];

Sada je potrebno fajl sa te lokacije premestiti u neku drugu lokaciju koja će biti trajna

Ako pretpostavimo da je to folder upload, koji se nalazi u root-u posmatranog hostinga sajta, ovu putanju možemo definisati kao promenljivu

$uploadDir = 'upload/’; Sada je potrebno formirati kompletnu novu putanju (putanja kroz folder

zaključno sa imenom i ekstenzijom fajla) Ako se zadržava postojeće ime i ekstenzija fajla, to se realizuje kao:

$filePath = $uploadDir . $fileName;

Premeštanje fajla

Kada postoji puna putanja do fajla na privremenoj lokaciji

$tmpName = $_FILES['userfile']['tmp_name'];

I kada postoji nova puna putanja kao:

$filePath = $uploadDir . $fileName;

Ostaje da se fajl sa jedne lokacije (privrmene) premesti na trajnu

Ovo se realizuje pomoću funkcije move_uploaded_file();

U konkretnom slučaju, premeštanje se vrši pomoću

$result = move_uploaded_file($tmpName, $filePath);

Promenljiva $result ima vrednost true ili false u zavisnosti da li je premeštanje uspešno realizovano ili ne.

Upload fajla na server u folder upload

Šta nakon upload-a Nakon uploada fajla na server i premeštanja fajla u željeni folder (npr. upload)

fajl se nalazi u okviru fajlova posmatranog sajta

Da bi se imala evidencije fajlova, njihova imena, tipovi fajlova i sl, ovi podaci se upisuju u bazu podataka, i sve što je potrebno radi se na bazi informacija iz baze, dok se samo fajl fizički skladišti na server

Fajl se može snimiti i u bazu podataka (kao tip BLOB, npr.) ali se ovo ne praktikuje jer povećava veličinu baze, pa samim tim i backup-e, pretragu i sl.

Zato se praktikuje snimanje fajla na server a putanju do istog u bazu, da bi se tačno znalo koji fajlovi postoje i na kojim lokacijama

U prethodnom primeru, fajl se u bazu može upisati nakon njegovog smeštanja u trajni folder tj u deo else{ }

Baza podataka

Baza podataka treba da sadrži tabele koje imaju kolone za sve podatke koji se dohvataju od korisnika

U ovom slučaju postoji samo jedno polje tipa file, pa je kreirana tabela upload_file_server koja ima kolone id, name, type, size i path, kao na slici

Tako će upit kojim se podaci dobijeni o fajlu upisuju kao: $query = "INSERT INTO upload_file_server (name, size, type, path )

VALUES ('$fileName', '$fileSize', '$fileType', '$filePath')";

Primer upload-a

Ceo kod

<html>

<head><title>Upload File</title></head>

<body>

<?php

$uploadDir = 'upload/';

if(isset($_POST['upload']))

{

$fileName = $_FILES['userfile']['name'];

$tmpName = $_FILES['userfile']['tmp_name'];

$fileSize = $_FILES['userfile']['size'];

$fileType = $_FILES['userfile']['type'];

$filePath = $uploadDir . $fileName;

$result = move_uploaded_file($tmpName, $filePath);

if (!$result) { echo "Error uploading file"; exit; }

else{

include 'konekcijaZaFile.php';

$fileName = addslashes($fileName);

$filePath = addslashes($filePath);

$query = "INSERT INTO upload_file_server (name, size, type, path ) VALUES ('$fileName', '$fileSize', '$fileType', '$filePath')";

$konekcija->query($query);

echo "<br/>File uploaded";

}

}

?>

<form action="fajlovi.php" method="post" enctype="multipart/form-data" name="uploadform">

<table width="350px">

<tr> <td>

<input name="userfile" type="file" id="userfile" />

</td> <td>

<input name="upload" type="submit" id="upload" value="Upload" />

</td> </tr>

</table>

</form>

</body>

</html>

Rezultat

Realizacija ograničenja

Ograničenja od strane programera

Često je potrebno ograničiti upload od strane korisnika

Ovo se može uraditi po više kriterijuma, ali su najkorišćeniji ograničenja po veličini tj. težini fajla i tipu fajla

Tako se često za profilnu sliku omogućuje samo slika koja je jpg formata do npr. 1MB ili slično.

Ovo se realizuje kodom na serverskoj strani upotrebom if-a

Npr.

if ($fileSize > 20000) { echo("Fajl je preveliki! Mora biti manji od $maxVelicina MB! <br/>");

}

if($tipFajla != "jpg" && $tipFajlaCovek != "png") {

echo("Fajl mora biti jpg, png ili gif formata!");

}

Prethodni kod za upload sada se može proširiti ovim kodom!

Upload sa ograničenjima

Kod koji je od ranije kada nije bilo ograničenja

Ako je sve u skladu sa ograničenjem ide se na upload fajla

Upload sa promenom imena fajla

Problem?

Kod svih do sada opisanih upload-a prvo je bio izvršen upload fajla na server, pa njegovo kopiranje iz privremenog u trajni folder i tek tada kada se taj posao okonča upis informacija o fajlu u bazu podataka

Međutim, ako jedan korisnik upload-uje sliku 1.jpg, u folder upload, pa drugi korisnik upload-uje drugu sliku sa istim imenom, u isti folder upload, nova slika će se presnimiti preko prethodne i prethodna će se izgubiti

Da se ovo ne bi dešavalo, fajlovi moraju imati unikatna imena

Ovo može da se postigne na više načina, ali jedan od najlakših je da se fajlovima da ime id-a iz tabele baze koji je autoincrement

Da bi se ovo uradilo, prvo se mora upisati zapis u bazu, pa kada se upiše da se dobije id, koji se koristi za novo ime fajla, pa se tek tada može prekopirati fajl u trajni folder

Ovo zahteva izmenu u opisanom kodu, koja je data u listingu

Za ove potrebe tabela je modifikovana tako da pored ranijih kolona ima i kolonu staroIme, gde se pamti originalno ime fajla

Prvo se upisuje jedan deo podataka u bazu,

bez imena fajla i putanje da bi se dobio id tog zapisa

Dohvatanje id-a poslednjeg zapisa

Određivanje ekstenzije fajla iz imena

Promena imena fajla kao id zapisa

Kopiranje fajla sa novim imenom

Dopuna postojećeg zapisa novim imenom i putanjom

<?php

$uploadDir = 'upload/';

if(isset($_POST['upload']))

{

$fileName = $_FILES['userfile']['name'];

$tmpName = $_FILES['userfile']['tmp_name'];

$fileSize = $_FILES['userfile']['size'];

$fileType = $_FILES['userfile']['type'];

$staroIme = addslashes($fileName);

include 'konekcijaZaFile.php';

$query = "INSERT INTO upload_file_server (size, type, staroIme ) VALUES ('$fileSize', '$fileType', '$fileName')";

$konekcija->query($query);

$poslednjiId = $konekcija->lastInsertId();

$imeDelici = explode(".", $fileName);

$ekstenzija = end($imeDelici);

$novoImeFajla = $poslednjiId . "." . $ekstenzija;

$filePath = $uploadDir . $novoImeFajla;

$result = move_uploaded_file($tmpName, $filePath);

if (!$result) { echo "Error uploading file"; exit; }

else{

$fileName = addslashes($novoImeFajla);

$query = "UPDATE upload_file_server SET name ='$fileName', path = '$filePath' WHERE id = '$poslednjiId';";

$konekcija->query($query);

echo "<br>File uploaded<br>";

}

}

?>

<html>

<head><title>Upload File sa drugim imenom</title> </head>

<body> <form action="fajlovi1.php" method="post" enctype="multipart/form-data" name="uploadform">

<table width="350px">

<tr>

<td>

<input name="userfile" type="file" id="userfile" />

</td>

<td>

<input name="upload" type="submit" id="upload" value="Upload" />

Prikaz spiska upload-ovanih fajlova -

attachment

Kako dohvatiti fajlove sa servera?

Nakon upload-a, logično je da se ti fajlovi nekako, nekada, trebaju prikazati korisniku

Prikaz fajla u samom sajtu je moguć samo u slučaju da browser može da prikaže format tog fajla (jpg, png, gif, pdf, …)

Generalno, kao oblik preuzimanja uploadovanih fajlova sa servera, korisniku se može prikazati spisak linkova, koji predstavljaju npr. imena fajlova koji su na serveru, gde se klikom na neki link sadržaj tog fajla automatski download-uje sa servera na klijentski računar.

Drugi oblik dohvatanja fajlova je njihovo preuzimanje sa servera i prikaz u web strani (za one tipove fajlova koji omogućavaju prikaz u browser-u)

Prikaz fajlova u formi linkova

Zadatak 1.

Kreirati stranicu koja prikazuje spisak uploadovanih fajlova (čitajući ih iz baze podataka) u formi linkova, gde se klikom na neki link sadržaj tog fajla automatski download-uje sa servera na klijentski računar.

Pretpostaviti da su fajlovi uploadovani na server, u folder upload, a podaci o fajlovima smešteni u bazu podataka u tabelu upload_file_server

Zadatak 1. - rešenje Prvi korak je prikazati imena fajlova iz baze u formi linkova

Linkove podesiti da „gađaju“ istu stranicu i prenose podatak id (id zapisa)

Dohvatanje podataka iz baze

Kreiranje dinamičke tabele

Kreiranje dinamičkih linkova

Na ovaj način dobijen je spisak linkova, koji su dinamički kreirani na bazi sadržaja iz tabele

Svaki link ima vidljiv deo kao ime upload-ovanog fajla i atribut href koji ukazuje na istu stranicu (u ovom primeru dohvatanjeBazaAttachment.php) kome se prosleđuje parametar id u kome se nalazi vrednost primarnog ključa za posmatrani zapis

Klikom na link, učitaće se ponovo ista stranica ali sa prosleđenim parametrom id, kao da smo to uradili na sledeći način ručno:

dohvatanjeBazaAttachment.php?id=3

Sada treba dodati kod koji u ovoj strani na bazi prosleđenog id-ja dohvata ranije upload-ovani fajl sa servera i isporučuje ga u formi attachment-a

Rezultat

Zadatak 1. – rešenje dodatak Dohvatanje podataka iz baze

„Cepanje“ objekta baze u niz

Provera da li fajl postoji na serveru i da li je dostupan

Modifikacija header-a HTTP-a za prosleđivanje attachment-a

Čitanje sadržaja upload-ovanog fajla i njegova isporuka (streaming) klijentu

<?php

if(isset($_GET['id'])) {

include 'konekcijaZaFile.php';

$id = $_GET['id'];

$query = "SELECT name, type, size, path FROM upload_file_server WHERE id = '$id'";

$result = $konekcija->query($query);

$red = $result->fetch(PDO::FETCH_ASSOC);

$filename = $red['name'];

$path = $red['path'];

$size = $red['size'];

if (file_exists($path) && is_readable($path)) {

//$size = filesize($path);

header('Content-Type: application/octet-stream');

header('Content-Length: '.$size);

header('Content-Disposition: attachment; filename='.$filename);

header('Content-Transfer-Encoding: binary');

$file = @ fopen($path, 'rb');

if ($file) {

fpassthru($file);

exit;

} else { echo "Nije uspeo stream!"; }

} else { echo "Fajl ne postoji ili nije dostupan za pristup"; }

exit;

}

?>

<html><head><title>Download File As Attachment</title></head>

<body>

<?php

include 'konekcijaZaFile.php';

$query = "SELECT id, name FROM upload_file_server";

$rezultat = $konekcija->query($query);

if ($rezultat->rowCount() > 0):

$i = 1;

echo "<table border='0px'> <tr><th>Rb.</th><th>Ime fajla</th></tr>";

foreach($rezultat as $red):

echo "<tr> <td>". $i ."</td> <td> <a href='dohvatanjeBazaAttachment.php?id=".$red['id'] ."'>".$red['name']."</a></td></tr>";

$i++;

endforeach;

echo "</table>";

endif;

?> </body> </html>

Zadatak 1. – celokupno rešenje

Prikaz spiska upload-ovanih fajlova –

kroz browser

Prikaz u browser-u

U prethodnom primeru je rešen problem preuzimanja fajla u formi attachment-a

Naglašeno je da se linkovi mogu postaviti direktno na putanju fajla, i na taj način simulirati rad klasičnog statičkog linka

Time se dobija mogućnost da se klikom na link upload-ovani sadržaj prikaže u browser-u, ako je to omogućeno od strane browser-a ili da se sadržaj download-uje kao attachment

Ovo predstavlja modifikaciju prethodnog koda, jer se kod prikaza linkova u atribut href direktno upisuje putanja (path) do mesta gde je fajl snimljen na serveru

Prikaz fajlova u formi linkova

Zadatak 2.

Kreirati stranicu koja prikazuje spisak uploadovanih fajlova (čitajući ih iz baze podataka) u formi linkova, gde se klikom na neki link sadržaj tog fajla prikazuje u browser-u ili automatski download-uje sa servera na klijentski računar, ako se ne može prikazati.

Pretpostaviti da su fajlovi uploadovani na server, u folder upload, a podaci o fajlovima smešteni u bazu podataka u tabelu upload_file_server

Zadatak 2. – rešenje

Dohvatanje podataka iz baze

Kreiranje dinamičkih linkova

Prikaz slika upload-ovanih na server

Prikaz fajlova u formi linkova

Zadatak 3.

Kreirati stranicu koja prikazuje slike upload-ovane na server.

Pretpostaviti da su fajlovi uploadovani na server, u folder upload, a podaci o fajlovima smešteni u bazu podataka u tabelu upload_file_server

Zadatak 3 – rešenje

Dohvatanje podataka iz baze

Kreiranje dinamičkih slika

Rezultat

Resize slike

<?php

$uploadDir = 'upload/';

if(isset($_POST['upload']))

{

$fileName = $_FILES['userfile']['name'];

$tmpName = $_FILES['userfile']['tmp_name'];

$fileSize = $_FILES['userfile']['size'];

$fileType = $_FILES['userfile']['type'];

// KOD ZA RESIZE SLIKE

}

?>

<html>

<head><title>Resize File</title></head>

<body>

<form action="fajloviSlikeJa.php" method="post" enctype="multipart/form-data" name="uploadform">

<table width="350px">

<tr>

<td>

<input name="userfile" type="file" id="userfile" />

</td>

<td>

<input name="upload" type="submit" id="upload" value="Upload" />

</td>

</tr>

</table>

</form>

</body>

</html>

if(isset($_POST['upload']))

{ $fileName = $_FILES['userfile']['name’]; $tmpName = $_FILES['userfile']['tmp_name'];

$fileSize = $_FILES['userfile']['size'];

$fileType = $_FILES['userfile']['type’];

list($sirina, $visina) = getimagesize($tmpName);

$novaSirina = 100;

$novaVisina = 50;

// Kreiranje nove slike (resource) od fajla ili URL-a

if( $fileType == "image/jpeg" ) { $postojecaSlika = imagecreatefromjpeg($tmpName); }

elseif( $fileType == "image/gif" ) { $postojecaSlika = imagecreatefromgif($tmpName); }

elseif( $fileType == "image/png" ) { $postojecaSlika = imagecreatefrompng($tmpName); }

//Kreiranje nove slike u koloru

$prazna_image = imagecreatetruecolor($novaSirina, $novaVisina);

imagecopyresampled($prazna_image, $postojecaSlika, 0, 0, 0, 0, $novaSirina, $novaVisina, $sirina, $visina);

$novaSlika = $prazna_image;

//Snimanje

$compression=75;

if( $fileType == "image/jpeg" ) { imagejpeg($novaSlika,$fileName,$compression); }

elseif( $fileType == "image/gif" ) { imagegif($novaSlika,$fileName); }

elseif( $fileType == "image/png" ) { imagepng($novaSlika,$fileName); }

echo "Ok"; }

Dohvatanje podataka o fajlu

Dohvatanje dužine i visine slike

Definisanje fiksne širine i visine nove slike

Pravljenje resursa od postojeće slike

Pravljenje prazne slike

Kopiranje dela postojeće slike u praznu sliku

Kopiranje dela postojeće slike u praznu sliku

imagecopyresized($prazna_img, $postojecaSlika, 0, 0, 0, 0, $novaSirina, $novaVisina, $sirina, $visina);

Krajnja koordinata u kopiranoj slici

Počev od koje koordinate iz kopirane slike se kreće

Gde se kopira

Rad sa slikama – kopiranje (Resize)

Od čega se kopira

Počev od koje koordinate u krajnjoj

slici se kreće kopiranje

Krajnja koordinata u originalnoj slici

Početna slika

Krajnja slika dobijena kopiranjem početne slike

0, 0

0, 0

$sirina, $visina $novaSirina, $novaVisina

if(isset($_POST['upload']))

{ $fileName = $_FILES['userfile']['name’]; $tmpName = $_FILES['userfile']['tmp_name'];

$fileSize = $_FILES['userfile']['size'];

$fileType = $_FILES['userfile']['type’];

list($sirina, $visina) = getimagesize($tmpName);

$procenat = 0.5;

$novaSirina = $sirina * $procenat;

$novaVisina = $visina * $procenat;

// Kreiranje nove slike (resource) od fajla ili URL-a

if( $fileType == "image/jpeg" ) { $postojecaSlika = imagecreatefromjpeg($tmpName); }

elseif( $fileType == "image/gif" ) { $postojecaSlika = imagecreatefromgif($tmpName); }

elseif( $fileType == "image/png" ) { $postojecaSlika = imagecreatefrompng($tmpName); }

//Kreiranje nove slike u koloru

$prazna_image = imagecreatetruecolor($novaSirina, $novaVisina);

imagecopyresampled($prazna_image, $postojecaSlika, 0, 0, 0, 0, $novaSirina, $novaVisina, $sirina, $visina);

$novaSlika = $prazna_image;

//Snimanje

$compression=75;

if( $fileType == "image/jpeg" ) { imagejpeg($novaSlika,$fileName,$compression); }

elseif( $fileType == "image/gif" ) { imagegif($novaSlika,$fileName); }

elseif( $fileType == "image/png" ) { imagepng($novaSlika,$fileName); }

echo "Ok"; }

Dohvatanje podataka o fajlu

Dohvatanje dužine i visine slike

Definisanje relativne nove širine i visine slike (podjednako po obe koordinate)

Pravljenje resursa od postojeće slike

Pravljenje prazne slike

Kopiranje dela postojeće slike u praznu sliku

Kopiranje dela postojeće slike u praznu sliku

if(isset($_POST['upload']))

{ $fileName = $_FILES['userfile']['name’]; $tmpName = $_FILES['userfile']['tmp_name'];

$fileSize = $_FILES['userfile']['size'];

$fileType = $_FILES['userfile']['type’];

list($sirina, $visina) = getimagesize($tmpName);

$novaSirina = 200px;

$procenat_promene = $sirina / $novaSirina ;

$novaVisina = $visina * $procenat_promene;

// Kreiranje nove slike (resource) od fajla ili URL-a

if( $fileType == "image/jpeg" ) { $postojecaSlika = imagecreatefromjpeg($tmpName); }

elseif( $fileType == "image/gif" ) { $postojecaSlika = imagecreatefromgif($tmpName); }

elseif( $fileType == "image/png" ) { $postojecaSlika = imagecreatefrompng($tmpName); }

Dohvatanje dužine i visine slike

Definisanje fiksne nove širine i proporcionalno izračunavanje nove visine

if(isset($_POST['upload']))

{ $fileName = $_FILES['userfile']['name’]; $tmpName = $_FILES['userfile']['tmp_name'];

$fileSize = $_FILES['userfile']['size'];

$fileType = $_FILES['userfile']['type’];

list($sirina, $visina) = getimagesize($tmpName);

$novaVisina = 200px;

$procenat_promene = $visina / $novaSirina ;

$novaSirina = $sirina * $procenat_promene;

// Kreiranje nove slike (resource) od fajla ili URL-a

if( $fileType == "image/jpeg" ) { $postojecaSlika = imagecreatefromjpeg($tmpName); }

elseif( $fileType == "image/gif" ) { $postojecaSlika = imagecreatefromgif($tmpName); }

elseif( $fileType == "image/png" ) { $postojecaSlika = imagecreatefrompng($tmpName); }

Dohvatanje dužine i visine slike

Definisanje fiksne nove visine i proporcionalno izračunavanje nove širine

imagecopyresized($prazna_img, $postojecaSlika, 0, 0, 0, 0, $novaSirina, $novaVisina, $sirina, $visina);

Krajnja koordinata u kopiranoj slici

Počev od koje koordinate iz kopirane slike se kreće

Gde se kopira

Rad sa slikama – Crop

Od čega se kopira

Počev od koje koordinate u krajnjoj

slici se kreće kopiranje

Krajnja koordinata u originalnoj slici

Početna slika Krajnja slika

dobijena kopiranjem početne slike

x1, y1 0, 0

x2, y2 $novaSirina, $novaVisina

Alfa transparentnost. 0 je ništa, a 100

kompletno kopiranje.

Zaštita slike žigom <?php

$slika = imagecreatefromjpeg('images/london.jpg');

$vodeniZig = imagecreatefromgif('images/watermark.gif');

imagecopymerge($slika, $vodeniZig, 100, 0, 0, 0, 250, 50, 50);

imagejpeg($slika);

imagedestroy($slika);

imagedestroy($vodeniZig);

?>

Slika sa transparentnom pozadinom

Copy and merge part of an image

Oslobađa memoriju sadržaja slike

Pozicija x, y, kopirane slike u konačnoj slici

Konačna i kopirana slika

Početna x, y pozicija od koje se uzima kopirana

slika

Krajnja x, y pozicija od koje se uzima kopirana

slika

Primer

Rad sa filterima

Primena efekta filtera na sliku bool imagefilter ( resource $image , int $filtertype [, int $arg1 [, int $arg2 [, int $arg3 [, int $arg4

]]]] )

<?php $im = imagecreatefrompng('dave.png'); if($im && imagefilter($im, IMG_FILTER_GRAYSCALE)) { echo 'Image converted to grayscale.'; imagepng($im, 'dave.png'); } else { echo 'Conversion to grayscale failed.'; } imagedestroy($im); ?>

Filteri IMG_FILTER_NEGATE: Reverses all colors of the image.

IMG_FILTER_GRAYSCALE: Converts the image into grayscale.

IMG_FILTER_BRIGHTNESS: Changes the brightness of the image. Use arg1 to set the level of brightness.

IMG_FILTER_CONTRAST: Changes the contrast of the image. Use arg1 to set the level of contrast.

IMG_FILTER_COLORIZE: Like IMG_FILTER_GRAYSCALE, except you can specify the color. Use arg1, arg2 and arg3 in the form of red, green, blue and arg4 for the alpha channel. The range for each color is 0 to 255.

IMG_FILTER_EDGEDETECT: Uses edge detection to highlight the edges in the image.

IMG_FILTER_EMBOSS: Embosses the image.

IMG_FILTER_GAUSSIAN_BLUR: Blurs the image using the Gaussian method.

IMG_FILTER_SELECTIVE_BLUR: Blurs the image.

IMG_FILTER_MEAN_REMOVAL: Uses mean removal to achieve a "sketchy" effect.

IMG_FILTER_SMOOTH: Makes the image smoother. Use arg1 to set the level of smoothness.

IMG_FILTER_PIXELATE: Applies pixelation effect to the image, use arg1 to set the block size and arg2 to set the pixelation effect mode.

Argumenti filtera

brightness

<?php $im = imagecreatefrompng('sean.png'); if($im && imagefilter($im, IMG_FILTER_BRIGHTNESS, 20)) { echo 'Image brightness changed.'; imagepng($im, 'sean.png'); imagedestroy($im); } else { echo 'Image brightness change failed.'; } ?>

Promena zastupljenosti boje

<?php $im = imagecreatefrompng('philip.png'); /* R, G, B, so 0, 255, 0 is green */ if($im && imagefilter($im, IMG_FILTER_COLORIZE, 0, 255, 0)) { echo 'Image successfully shaded green.'; imagepng($im, 'philip.png'); imagedestroy($im); } else { echo 'Green shading failed.'; } ?>

Rad sa fajlovima

Dr Nenad Kojić, dipl. inž. Milena Vesić, spec .stuk.inž.

Danijela Nikitin, spec .stuk.inž.

Školska 2017/18. Nikola Mihajlović, spec .stuk.inž.

Luka Lukić, struk. inž.

Visoka škola strukovnih studija za informacione

i komunikacione tehnologije