Ngarkimi i skedarëve është ndër opsionet më të shpeshta që u ofrohen vizitorëve. Mund të jetë për të ngarkuar foto, dokumenta apo çfarëdo që e bën aplikacionin më interaktiv dhe personal. Edhe nëse nuk ju janë dashur kurrë, e sigurtë është që do vijë momenti dhe pse mos të jeni të përgatitur?!
Për fatin tonë, PHP ofron nivel të lartë abstraksioni për ngarkimin e skedarëve. Si ç’do shihni në vijim, kodi që bën ngarkimin është fare minimal dhe më tepër do merremi me validimin e formës. Megjithatë, përpara se të merremi me kodin PHP, duhet fillimisht të ndërtojmë një formë HTML.
Kodi më poshtë do të krijojë një formë të gatshme për ngarkim skedarësh. Atributi “enctype” përcakton tipin e enkodimit me të cilin skedarët do të dërgohen, ndërsa vlera “multipart/form-data” tregon se skedarët do të jenë binarë. Ju mjafton të dini se për të krijuar një formë ngarkimi, duhet të vendosni egzaktësisht atë atribut dhe vlerë. Pjesa tjetër është thjeshtë një “input” i tipit “file”, i cili shfaq një buton për të zgjedhur skedarin, dhe një buton për të dërguar formën. Mbani mend që input-it i kam vënë emrin “skedari”. Do e përdorim më pas në kodin PHP.
| HTML | | Kopjo Kodin | | ? |
| 1 | <form method="post" enctype="multipart/form-data"> |
| 2 | <input type="file" name="skedari"> |
| 3 | <button type="submit">Ngarko</button> |
| 4 | </form> |
| 5 | <p><!-- kodi PHP ne vijim do shkruhet ketu --></p> |
| 6 |
Superglobalja $_FILES
Në momentin që dërgohet një formë si ajo më sipër, PHP krijon një variabël superglobale që përmban të gjitha informacionet e nevojshme rreth skedarit që po tentohet të ngarkohet. Variabla quhet $_FILES dhe në të vërtetë është një vektor multi-dimensional me disa çelësa. Po ju tregoj fillimisht çfarë vlere ka secili çelës.
$_FILES['skedari']['name'] => Emri i skedarit (psh: dokumenti.txt)
$_FILES['skedari']['type'] => Tipi (MIME) i skedarit (psh: image/jpeg)
$_FILES['skedari']['size'] => Madhesia e skedarit në byte (psh: 1024)
$_FILES['skedari']['tmp_name'] => Emri i përkohshëm i skedarit
$_FILES['skedari']['error'] => Kodi i gabimit nëse ngarkimi dështon
Do shihni që vektori thërritet me 2 çelësa. I pari është sigurisht emri i fushës së ngarkimit të cilës arbitrarisht ja vendosa “skedari”, por mund të jetë çfarëdo. Mjafton që çelësi i parë i vektorit të përputhet më atributin “name” në fushë. Çelësat e dytë janë ato që mbajnë informacionet rreth skedarit dhe pikërisht ato do të përdorim gjatë ngarkimit.
Për ta sqaruar pak proçesin, sepse me siguri mund t’ju bëjë konfuz; skedarët ngarkohen automatikisht në server, në direktorinë /tmp (/temp apo si do të jetë përcaktuar), kur forma dërgohet. Kjo ndodh edhe nëse nuk ka asnjë proçesim më pas. Por, në momentin që skripti mbaron egzekutimin, skedari i përkohshëm fshihet automatikisht. Detyra e PHP-së është që këtë skedar të përkohshëm (të aksesueshëm përmes $_FILES['skedari']['tmp_name']) ta lëvizë në direktorinë e duhur.
Ngarkimi më i Thjeshtë i Mundshëm
Le të prekim temën për të cilën besoj jeni më të interesuar. Do shkruaj pak rreshta kod PHP që realizon ngarkimin në formën më të thjeshtë të mundshme. Në seksionin tjetër do e zhvillojmë që të ofrojë më tepër siguri dhe validim.
| PHP | | Kopjo Kodin | | ? |
| 01 | <?php |
| 02 | if (count($_FILES['skedari'])) { |
| 03 | $tmp = $_FILES['skedari']['tmp_name']; |
| 04 | $emri = $_FILES['skedari']['name']; |
| 05 | |
| 06 | if (move_uploaded_file($tmp, $emri)) { |
| 07 | echo 'Skedari u ngarkua me sukses.'; |
| 08 | } else { |
| 09 | echo 'Ndodhi nje problem ne ngarkim!'; |
| 10 | } |
| 11 | } |
| 12 | ?> |
| 13 |
Fillimisht kam kontrolluar nëse vektori $_FILES është krijuar, që do të thotë se forma është dërguar. Funksioni count() kthen numrin e elementëve të vektorit, ose 0 (zero) nëse nuk gjendet asnjë. Zero si numër, në PHP është ekuivalente me Boolean FALSE.
Funksioni tjetër që kam përdorur është move_uploaded_file(). Ky është një funksion i dedikuar për ngarkimin e skedarëve dhe bën spostimin e skedarit të përkohshëm ($tmp) në direktorinë e duhur. Nëse spostimi kryhet, funksioni kthen TRUE dhe printohet mesazhi i suksesit. Në të kundërt, funksoni kthen FALSE dhe printohet mesazhi i gabimit.
Në rastin më sipër, skedari spostohet në direktorinë ku ndodhet skripti, por mund të jetë çfarëdo direktorie. Në atë rast, parametri i dytë i funksionit move_uploaded_file() do të ishte: “direktoria/$emri”. Rëndësi ka që direktoria të jetë e shkrueshme dhe e aksesueshme nga user-i i serverit web.
Ngarkim pak më i Komplikuar
Deri tani keni parë një rast super të thjeshtë ngarkimi që realisht e bën punën. Problemi qendron se nuk ofron absolutisht asnjë validim dhe zero siguri. Kushdo mund të ngarkojë çfarëdo skedari në server, pa u kufizuar në format apo madhësi. Më keq akoma, një sulmues mund të ngarkojë një skedar PHP me të cilin bën ç’të dojë me serverin. Sigurisht, askujt nuk i intereson të ofrojë një mjet interaktiv i cili është vulnerabël.
Kodi në vijim do ngrihet në bazat që hodhëm më sipër, përsëri duke përdorur superglobalen $_FILES dhe funksionin move_uploaded_file(), por tashmë me kontroll të plotë mbi skedarin. Do kontrollohet madhësia, tipi i skedarit dhe emri do të zëvendësohet që të mos përmbajë karaktere të çuditshme.
| PHP | | Kopjo Kodin | | ? |
| 01 | <?php |
| 02 | if (count($_FILES['skedari'])) { |
| 03 | $tmp = $_FILES['skedari']['tmp_name']; |
| 04 | $emri = $_FILES['skedari']['name']; |
| 05 | $madhesia = $_FILES['skedari']['size']; |
| 06 | |
| 07 | // pathinfo() me parametrin PATHINFO_EXTENSION kthen |
| 08 | // shtojcen (extension) e skedarit. Kthimi do te jete |
| 09 | // i tipit: jpg, png apo txt. |
| 10 | $shtojca = pathinfo($emri, PATHINFO_EXTENSION); |
| 11 | |
| 12 | // Madhesia maksimale ne byte. Shumezimi me poshte do te |
| 13 | // ktheje "512 000", qe jane 500 KB. |
| 14 | $madhesia_maks = 1024 * 500; |
| 15 | |
| 16 | // Nje vektor me shtojcat e lejuara |
| 17 | $skedaret_lejuar = array('jpg', 'png', 'gif', 'bmp'); |
| 18 | |
| 19 | // Kontrollon nese emri nuk eshte bosh |
| 20 | if ($emri != '') { |
| 21 | if ($madhesia <= $madhesia_maks) { |
| 22 | // in_array() kontrollon nese nje vlere ndodhet ne |
| 23 | // vektorin e dhene. Ne rastin tone, kontrollon nese |
| 24 | // shtojca ndodhet ne listen e shtojcave te lejuara. |
| 25 | if (in_array($shtojca, $skedaret_lejuar)) { |
| 26 | // preg_replace() zevendeson tekstin e kerkuar me nje |
| 27 | // tekst te dhene ne baze te Regular Expressions. |
| 28 | // Kodi qe kam shkruar per kerkim, gjen te gjitha karakteret |
| 29 | // jo-alfanumerike (pervec minusit dhe pikes) dhe i fshin. |
| 30 | $emri = preg_replace('|[^a-z0-9-.]|i', '', $emri); |
| 31 | |
| 32 | if (move_uploaded_file($tmp, "direktoria/ngarkimeve/$emri")) { |
| 33 | echo 'Skedari u ngarkua me sukses.'; |
| 34 | } else { |
| 35 | echo 'Ndodhi nje problem ne ngarkim!'; |
| 36 | } |
| 37 | } else { |
| 38 | echo 'Skedari i zgjedhur nuk eshte i formatit te duhur.'; |
| 39 | } |
| 40 | } else { |
| 41 | echo 'Madhesia maksimale e lejuar eshte 500 KB.'; |
| 42 | } |
| 43 | } else { |
| 44 | echo 'Duhet te zgjidhni nje skedar me pare.'; |
| 45 | } |
| 46 | } |
| 47 | ?> |
Nuk duhet të ketë shumë gjëra të reja këtu, sepse s’kam bërë asgjë më shumë se disa validime tipike. Megjithatë, komentet duhet t’ju sqarojnë edhe ato paqartësi të mundshme, sidomos për funksionet pathinfo(), in_array() dhe Regular Expression. Ajo që ka rëndësi këtu është të kuptoni se ngarkimi i skedarëve mund të krijojë probleme të mëdha sigurie nëse nuk merrni masat e duhura. Përgjithësisht, mjafton që formatet e skedarëve të lejuar të përcaktohet si një listë e bardhë, në mënyrë që të filtroni vetëm ato që duhen. Thënë këto, asnjëherë mos lejoni të ngarkohen skedarë të egzekutueshëm apo skripte që mund të thërriten më pas nga shfletuesi.
Limitet në Ngarkim
Ngarkimi i skedarëve është një proçes që kërkon resurse nga serveri dhe për skedarë të mëdhenj, kërkon kohë. Si i tillë, abuzimi i pa-vetëdijshëm është shumë i mundshëm dhe për këtë arsye, PHP ofron disa direktiva për ti konfiguruar detajet e ngarkimit. Problemi është se shpesh herë këto konfigurime limitojnë aftësinë e ngarkimit dhe pengojnë eksperiencën e mirë të vizitorëve në aplikacion. Do ju tregoj cilat janë këto direktiva dhe për çfarë shërbejnë, në mënyrë që ti ndryshoni sipas nevojave.
file_uploads
Kjo është direktiva që lejon ose bllokon ngarkimin e skedarëve. Vlera bazë është “1″, pra e aktivizuar dhe normalisht, nëse doni të ofroni ngarkim skedarësh, duhet të mbetet e tillë.
upload_max_filezise
Limiton madhësine maksimale që një skedar mund të ngarkohet. Vlera bazë është “2M” (2 Mega Byte) dhe mund të modifikohet me një vlerë si numër për të shprehur byte, ose në formën e lexueshme: 500K, 10M, 100M, etj. Nëse në aplikacionin tuaj parashikoni ti lejoni vizitorët të ngarkojnë skedarë më të mëdhenj, rriteni vlerën respektivisht. Megjithatë, llogarisni që skedarë të mëdhenj të ngarkuar nga shumë vizitorë do e mbushin diskun shpejt.
post_max_size
Limiton madhësine maksimale të të dhënave që dërgohen me POST, përfshirë edhe ngarkimin e skedarëve. Vlera bazë është “8M”. Si rregull, post_max_size duhet të jetë më e madhe se upload_max_filesize, duke llogaritur qe krahas skedarëve për ngarkim, forma mund të përmbajë edhe të dhëna të tjera.
max_file_uploads
Limiton numrin e skedarëve që mund të ngarkohen në të njëjtën kohë. Vlera bazë është “20″, që do të thotë se mund të ngarkohen deri në 20 skedarë njëkohësisht. Nuk besoj se do ju duhen më tepër, por nëse po, mund ta modifikoni lirisht. Ngarkimin e më shumë se 1 skedari njëkohësisht do e shpjegoj në seksionin në vijim.
max_execution_time
Limiton kohën maksimale që një skript mund të egzekutohet, me vlerë bazë “30″ sekonda. Ndërsa nuk ka të bëjë direkt me ngarkimin e skedarëve, nëse koha që një skedari i duhet të ngarkohet e kalon kohën maksimale të egzekutimit, në fund ngarkimi do të dështojë. Nëse doni të ofroni ngarkim skedarësh të mëdhenj, sigurohuni ta rrisni kohën e egzekutimit në një vlerë që parashikon ngarkimin edhe në linja interneti jo shumë të fuqishme.
max_input_time
Limiton kohën maksimale që të dhëna nga POST ose GET mund të proçesohen. Vlera bazë është “-1″ (infinit) dhe me siguri e tillë është edhe në konfigurimin tuaj të PHP-së, por sigurohuni në çdo rast. Duhet të jetë të paktën sa vlera e vendosur në max_execution_time.
memory_limit
Limiton memorjen (RAM) që i vihet në dispozicion një skripti. Vlera bazë është “8M” ose “16M” në varësi të versionit të PHP-së. Zakonisht nuk është ide e mirë të rritet shumë, sepse mund të kompromentojë proçeset e tjera të serverit nëse një skript konsumon shumë memmorje. Megjithatë, nëse serveri ka RAM mjaftueshëm, mund ta rrisni në një vlerë mesatare për të lejuar ngarkime skedarësh të mëdhenj. Si rregull, memory_limit duhet të jetë më e madhe se post_max_size dhe si rrjedhim, akoma më e madhe se upload_max_filesize. Vendosini vlera në raport me resurset e serverit.
Ngarkimi i Disa Skedarëve në një Kohë
Shpesh herë mund t’ju duhet të ofroni forma ngarkimi që i lejojnë vizitorët të zgjedhin më shumë se 1 skedar dhe ti ngarkojnë njëkohësisht. Praktika është pothuajse e njëjtë me ato që kemi bërë deri tani, vetëm se do bëjmë pak modifikime në formën HTML dhe do e shfrytëzojmë ndryshe superglobalen $_FILES. Kjo e fundit është pak e komplikuar, sidomos për ata që nuk kanë eksperiencë me vektorët multi-dimensionalë, por do tentoj ta mbaj sa më të thjeshtë dhe të qartë shpjegimin.
Mbani mend që limitet e përmendura më sipër janë edhe më të efektshme nëse ngarkohen 2 apo më shumë skedarë. Nëse një skedar 1MB kërkon 10 sekonda të ngarkohet, 5 skedarë nga 1MB kërkojnë 50 sekonda. Nëse rritet madhësia, kohët bëhen edhe më të mëdha, prandaj tentoni të gjeni një vijë të ndërmjetme.
Fillimisht do modifikoj formën HTML që të shfaqë 3 fusha ngarkimi. Shihni që të treja fushat janë egzaktësisht të njëjta dhe me të njëjtin emër: skedari[]. Kllapat katrore në fund të emrit bëjnë që fushat të trajtohen si vektor dhe jo si fusha individuale. Praktikisht, kam krijuar një vektor me emrin “skedari” brenda superglobales $_FILES. E kuptoj që është pak e komplikuar, por do shkojmë edhe aty. Për momentin, ju duhet të dini vetëm rolin e kllapave katrore në emër. Në të njëjtën formë mund të shtohen fusha të tjera për të ofruar 5, 10 apo 20 fusha ngarkimi.
| HTML | | Kopjo Kodin | | ? |
| 1 | |
| 2 | <form method="post" enctype="multipart/form-data"> |
| 3 | <input type="file" name="skedari[]"> |
| 4 | <input type="file" name="skedari[]"> |
| 5 | <input type="file" name="skedari[]"> |
| 6 | <button type="submit">Ngarko</button> |
| 7 | </form> |
| 8 |
Me modifikimin që kam bërë, nëse do dërgoja formën dhe të shihja përmbajtjen e superglobales $_FILES, do e kisha shumë më të qartë strukturën e tij. Pikërisht këtë do bëj dhe jam i sigurt që ato që kam thënë më sipër do marrin kuptim. Hidhini një sy:
name => 1.txt, 2.txt, 3.txt type => text/plain, text/plain, text/plain tmp_name => /tmp/phprXpPaM, /tmp/phpQRVX5c, /tmp/php2rgAXH error => 0, 0, 0 size => 682, 1402, 880
Praktikisht krijohet një vektor multidimensional shumë i ngjashëm me atë që kemi parë deri tani. I vetmi ndryshim është se çelësat “name”, “type”, “tmp_name”, “error” dhe “size” nuk janë më vlera të thjeshta, por vektorë. Si ç’e shihni, çdo çelës mban 3 vlera për secilin skedar të zgjedhur. Nëse do ishin 10 fusha ngarkimi, secili çelës do mbante 10 vlera. Besoj është e qartë tashmë se si mund ti ngarkojmë të gjithë skedarët në një kohë, por patjetër që do ju tregoj një kod të plotë. Në këtë rast nuk jam fokusuar në validim, sepse atë tashmë duhet të dini ta bëni dhe s’ka fare ndryshim nga ajo që ju tregova më herët, por në shfletimin e vektorit dhe ngarkimin e skedarëve.
| PHP | | Kopjo Kodin | | ? |
| 01 | <?php |
| 02 | if (count($_FILES['skedari'])) { |
| 03 | // Merr vektorin qe ndodhet nen celesin "name". |
| 04 | // Vektori eshte i formes: |
| 05 | // [name] => array('1.txt', '2.txt', '3.txt') |
| 06 | $emrat = $_FILES['skedari']['name']; |
| 07 | |
| 08 | // Merr vektorin qe ndodhet nen celesin "tmp_name". |
| 09 | // Vektori eshte i formes: |
| 10 | // [tmp_name] => array('1.txt', '2.txt', '3.txt') |
| 11 | $skedaret_tmp = $_FILES['skedari']['tmp_name']; |
| 12 | |
| 13 | // Shfleton vektorin e emrave per te mundesuar |
| 14 | // ngarkimin individual te secilit skedar. Celesat |
| 15 | // vendosen automatikisht ne vektor duke nisur nga zero |
| 16 | // dhe jane te njejte per cdo vektor. Pra, vektori "name" |
| 17 | // ka te njejtin numer elementesh dhe celesa me vektorin |
| 18 | // "tmp_name", "type", "size" dhe "error". Skedari i pare |
| 19 | // ne vektorin "name" ka celesin "0" dhe kjo perputhet |
| 20 | // me direktorine e perkohshme te skedarit te pare ne |
| 21 | // vektorin "tmp_name". |
| 22 | foreach ($emrat as $celesi => $emri) { |
| 23 | $tmp = $skedaret_tmp[$celesi]; |
| 24 | |
| 25 | if (move_uploaded_file($tmp, $emri)) { |
| 26 | echo "Skedari $emri u ngarkua me sukses."; |
| 27 | } else { |
| 28 | echo "Ndodhi nje problem gjate ngarkimit te skedarit $emri."; |
| 29 | } |
| 30 | } |
| 31 | } |
| 32 | ?> |
Dyshoj të jetë e komplikuar sepse nuk është asgjë më shumë se shfletim vektori dhe në momentin që e keni të qartë strukturën, asgjë nuk i mbetet rastësisë. Pjesa që ndoshta mund t’ju hutojë pak është përdorimi i çelësave të vektorit $emri për të referencuar vlerat e vektorit $skedaret_tmp. Si ç’e kam komentuar në kod, e gjithë ideja këtu është që çelësat në secilin vektor janë të njëjtë dhe përputhen për skedarët e ndryshëm. Pra, skedari i parë e ka emrin në elementin me çelësin 0 si në vektorin “name”, ashtu edhe në vektorin “tmp_name”.
Vektorët multi-dimensionalë janë ndër strukturat e të dhënave më komplekse në PHP, duke qenë se mund të shkojnë në thellësi virtualisht të pafundme të cilat bëhen të vështira të shfletohen. Nëse keni probleme ti kuptoni, kam shkruar një guidë të dedikuar për to që titullohet “Vektorët në PHP“. Krahas koncepteve tipike për vektorët, kam shpjeguar edhe si ndërtohen dhe shfletohen vektorët multi-dimensionalë, së bashku me disa funksione interesante të dedikuar për ta. Vektori multi-dimensional në rastin tonë është fare i thjeshtë, por nuk është çudi ta hutojë një fillestar.
Si ta Përmirësoni Eskperiencën e Ngarkimit
E vërteta është që forma standarte e ngarkimit të skedarëve nuk i ofron shumë vizitorëve. Nuk ka asnjë shenjë progresi (vetëm nëse e merr përsipër shfletuesi, si psh Chrome) deri sa skedari të ngarkohet dhe për raste ku madhësia është e konsiderueshme, mund të kërkojë aq kohë sa vizitori të hamendësojë se proçesi ka mbaruar apo ka ndodhur një problem. Sigurisht, në plot raste nuk është e nevojshme, sidomos aty ku ngarkohen skedarë të vegjël, por nëse doni ta çoni aplikacionin në nivelin tjetër, ju duhet të ofroni një zgjidhje të mirë.
Për fat të keq, PHP nuk ofron asgjë për të treguar progresin e ngarkimit dhe limitohet vetëm në transferimin e skedarit. Praktikisht është e pamundur me PHP dhe të vetmet zgjidhje që mbaj mend kanë qenë me versione të modifikuara (PHP e patch-uar). Kjo e fundit vështirë se mund të quhet zgjidhje dhe personalisht as nuk kam tentuar ta shoh si funksionon. Nga ana tjetër, zgjidhje të mira egzistojnë duke përdorur teknologji alternative ndaj PHP.
Një zgjidhje mjaft popullore vitet e fundit për të ofruar indikator progresi gjatë ngarkimit është duke përdorur Flash. Dakort, jo të gjithë janë përkrahës të Flash, përfshi edhe mua, por në këtë rast e bën punën shumë mirë. Më e mira është se Flash ka akses në parametra si madhësia e skedarait dhe sasia e ngarkuar, kështu që me pak llogaritje mund të nxirret progresi. Alternativa gati për përdorim ka plot, por i preferuari im është Uploadify. E kam përdorur shpesh në projekte dhe përvec se funksionon shumë mirë dhe instalohet për 2 minuta, ka plot opsione konfigurimi për ta përshtatur me nevojat tuaja.
Pamje nga ngarkuesi Uploadify
Alternativa që me siguri do bëhet standarti i të ardhmes është duke përdorur XMLHttpRequest, atë që vë AJAX në jetë. Ashtu si thirrjet AJAX, në shfletuesit modernë është e mundur të dërgohen skedarë binarë dhe të shfaqet progresi i ngarkimit. E mira këtu është se s’ka nevojë për Flash, gjë që e bën zgjidhje të pastër në Javascript. Një zgjidhje e gatshme që përdor XHR është Ajax Upload. Ofron zgjedhje dhe ngarkim të shumë-fishtë skedarësh, hedhje e skedarëve direkt në shfletues me drag-and-drop dhe kthim në iFrame të fshehur për shfletues të vjetër. I vetmi problem është se indikatori i progresit funksionon vetëm në Firefox 3.6+, Chrome 6+ dhe Safari 4+.
Përfundimi
Besoj se gjithçka ka qenë e thjeshtë dhe nuk kemi eksploruar me tepër se disa funksione PHP. Megjithatë, ngarkimi i skedarëve është një opsion që ju duhet patjetër ta keni në arsenalin e njohurive. Nuk ju falet nëse nuk përvetësoni diçka kaq të thjeshtë
E vetmja pjesë ku kompleksiteti rritet pak është ngarkimi i 2 ose më shumë skedarëve dhe për këtë kanë rol vektorët multi-dimensional. Kodi që ju kam ilustruar në sektorin përkatës është praktikisht gjithçka ju duhet dhe mund të përdorni atë për ta zgjeruar në bazë të kërkesave personale dhe validimit që do të ofroni.
Mësim të mbarë.






te falemnderit Fadion, na kishte mare malli per ndonje guid
E vertete, por impenjimet bejne te veten. Gjate kesaj periudhe do sjellim disa guida te reja, keshtu qe stay tuned
Pergezime ke bere shume pune te mire Fadjon!
Me behet qejfi qe te ka hyre ne pune.
pergezimet e mia per guiden. hmmm kam nje ide tjeter per progresin e ngarkimit duke perdorur vetem javascript (ose j querry nuk eshte e thene, e rendesishme te njihet nga cdo browser) dhe php. gjithsesi me pelqen shum guida qe ke dhene (me pelqen shum e gjith faqja sidomos ngaqe jam admirues i zjarrte i cunave te laboratori.al
)
Shum artikull i detajuar , te faleminderit !
Mua me jep probleme me scriptin Uploadify. Fillon procesi, behen upload 100% por ne direktorine ku e kam percaktuar une nuk del file qe vendosa pak me para ne upload. Mund te me ndihmoni se cfare problemi mund te kete?
Nuk ka problem e rregullova. Harrova te vendosja CHMOD 777 tek folderi.