PHP: nalaganje datoteke v strežnik
Prenos datotek prek PHP-ja je zelo zanimiva stvar, zato jo zelo natančno obiščite. V internetu lahko najdete številne primere izvajanja prenosov datotek, vendar niso vse dobre in izpolnjujejo varnostna pravila.
Vsebina
Takšne stvari je treba končati, tudi če traja dolgo. Če pustite luknjo v kodi, je morda v nevarnosti celoten strežnik.
Varnost
Uporaba PHP prenašanje datotek na strežniku je dovolj enostavno. Koda je zelo kratka in preprosta. Samo nekaj vrstic. Toda takšna metoda je nevarna. Kje več časa in vrstic kode gre za varnost.
Nevarnost je, da če ne opravite nobenih preverjanj, bo vsak napadalec lahko prenesel svoje skripte na vaš strežnik. V tem primeru ima poln dostop. Lahko naredi vse, kar hoče:
- izbrišite bazo podatkov;
- brisanje datotek na spletnem mestu;
- spreminjanje spletnih mest;
- dodajte svoje oglase na svojo spletno stran;
- prenosi virusov;
- preusmeri vse uporabnike na svoja spletna mesta;
- in še veliko več, da bo vlomilec prišel na misel.
Vedno morate preveriti, kaj poskuša uporabnik naložiti za datoteko. Če na primer naložite samo fotografije, morate preveriti, ali je ta datoteka ravno slika. V nasprotnem primeru boste vse prenesli.
Kako natančno izvedite test bo prikazan pozneje, ko neposredno preučite skript za prenos datoteke.
Ustvarjanje obrazca PHP
Obrazec za prenos datoteke je zelo enostaven. Dovolj gumbov za brskanje in gumbov za prenos.
Ne bomo opisali oblikovanja obrazca, saj je enostavno. Nadaljnja navodila domnevajo, da že imate osnovne koncepte HTML-ja (v nasprotnem primeru ne bi našli informacij o nalaganju v PHP).
Toda upoštevajte, da morate za prenos podatkov v obrazcu dodati atribut enctype.
V nasprotnem primeru podatki o upravljalniku datotek ne bodo posredovani.
Kako naj to deluje?
Ko kliknete gumb za brskanje, odprete okno, kjer boste morali izbrati datoteko.
Potem naj se pojavi pot, kjer se nahaja datoteka.
Če se pot ne pojavi, to naredite znova.
Po kliku na gumb za nalaganje lahko katera koli informacija prikaže z datoteko upravljalca.
Na primer, lahko napišete črto, ki pravi, da je bila datoteka z »tako-tako-tem« ime uspešno naložena v mapo »tako-in-taka«. Seveda bo ime datoteke vedno drugačno.
Običajno se te podrobne informacije uporabljajo za debug kodo. Na ta način lahko preverite, ali se podatki prenesejo, in zapisi se nahajajo v imeniku, ki ga potrebujete. To pomeni, da tudi ime datoteke ne označuje. Ker so to dodatne informacije, ki jih uporabnik ne potrebuje.
Smiselno je izpisati podatke o imenu le, če uporabnik prenese več datotek. Ta primer bomo razmislili še malo. Ne bomo nadaljevali.
Prilagodi
V PHP-ju naložitev datoteke v strežnik zahteva določene nastavitve v datoteki php.ini. V tej datoteki je veliko nastavitev. Vsi jih ne potrebujemo. Zanimajo nas tri vrstice: file_uploads, upload_tmp_dir in upload_max_filesize.
Upoštevajte, da bodo te nastavitve vplivale na vsa vaša spletna mesta na strežniku, ne le na eno od njih. Zato nastavite največjo velikost glede na to, kaj boste naložili uporabnikom. Ni priporočljivo nastaviti previsoke vrednosti.
Ko spremenite vrednosti v teh nastavitvah, je treba strežnik ponovno zagnati. V nasprotnem primeru nastavitve ne bodo začele učinkovati, ker se berejo ob nalaganju strežnika.
To lahko storite v konzoli tako, da prek SSH povežete s strežnikom. Dovolj je, da vnesete ukazni servis httpd restart, nato pa bodo nastavitve začele veljati.
Drug način je, da znova zaženete prek panela ISP ali prek panelov za obračun ponudnika.
Array z datoteko
V PHP je datoteka naložena s pomočjo polja $ _FILES. Vsebuje vse informacije o datotekah, ki jih bomo prenesli.
Da bi videli, kakšne informacije se nahaja v tej matriki, je dovolj, da v datoteki vodnika napišete naslednje.
Izberite katero koli datoteko in kliknite »Prenos«. Na strani upravljalca so prikazani podatki, shranjeni v $ _FILES. Spremenljivka je napisana v celoti z velikimi črkami. PHP je jezik, občutljiv na primere.
Kot vidite, v tej matriki obstaja veliko polj. Vsi so pomembni za nas. Prvo polje shrani ime datoteke v obliki, v kateri se uporablja na vašem računalniku.
Stolpec vrste označuje vrsto datoteke. Polje tmp_name ustreza imenu začasne datoteke. Ko se scenarij konča, bo izbrisan.
Polje napak shrani kodo napake. O tem še malo. Velikost - velikost v bajtih.
Napake
Prenos datoteke prek PHP vedno spremlja koda napake. Sporočilo o napaki je vključeno v polje "error". V screenshotu je napaka nič.
Upoštevajte vrednosti vseh napak:
Nad njim je bilo rečeno o parametru, ki ga je mogoče navesti v običajnem HTML-ju.
Tukaj je primer obrazca za nalaganje datoteke, kjer je določena omejitev velikosti datoteke, ki se naloži.
PHP: skript za prenos datoteke
Kako je vse v praksi? V PHP se datoteka prenese z ukazom kopiranja. Če vas zanima vprašanje prenosa datoteke, potem je odgovor preprosto kopiranje, ki uporablja dva parametra - izvorno datoteko in ciljno datoteko.
Toda, kot je navedeno zgoraj, zaradi varnostnih razlogov tega ni mogoče omejiti. Na primer, če želite preveriti vrsto datoteke, ki jo pošiljamo, lahko uporabimo vrsto polja v matriki $ _FILES. Najprej bomo to ugotovili s preizkusom in nato prešli na celoten skript
Recimo, da želite uporabnikom naložiti fotografijo z ločljivostjo samo GIF, JPEG ali PNG. To lahko določite tako.
če ($ _ FILES [`file_upload`] [`tip`]! = "slika / gif") {
echo "Žal nam je, da prenesemo le datoteke GIF" -
exit-
}
Če želite poslati vse 3 vrste, enostavno dodajte še en dodaten pogoj z drugo vrsto slike.
Kopiranje je izvedeno tako: kopiranje (datoteka 1, datoteka 2).
V našem primeru, ko delo nadaljuje s prenosom iz računalnika v strežnik, lahko to storite
kopirajte ($ _ FILES [`file_upload`] ["tmp_name"], "1.jpg")
To pomeni, da bo datoteka kopirana z imenom 1.jpg. To ni povsem pravilno. V tem primeru je to le primer. Ime datoteke mora biti vedno nastavljeno drugače, razširitev pa mora biti podana glede na datoteko.
Razširitev lahko določite na več načinov. Vse je odvisno od eudicije razvijalca. Eden od najhitrejših načinov (razlika v desetih sekundah) določitve razširitve je naslednja koda.
$ path_info = pathinfo ($ _ FILES [`photo1`] ["ime"]);
$ ext = $ path_info [`razširitev`];
V spremenljivki $ ext bomo shranili zahtevano razširitev. Ime datoteke je mogoče naključno nastaviti z uporabo md5. Če nameravate prenesti več datotek, jih je bolje naložiti v različne mape. Torej bo bolj priročno. Še posebej, če želite očistiti.
Koda za prenos bo naslednja.
razpoložljivost fotografij
če ($ _FILES [`photo1`] [`tmp_name`] == null)
{
echo ("
Datoteka ni podana.
") -izstop;
}
///. Recimo, da imate dovoljenje za prenos velikih datotek (videoposnetkov) za projekt na strežniku, vendar bodo samo fotografije, uporabniki pa morajo omejiti
če (($ _FILES ["photo1"] ["velikost"]> 1024 * 1024 * 2)
{
?>
Največja dovoljena velikost slike 2 MB
izstop;
}
// ustvarite mape
// ustvarite mapo trenutnega meseca
če (! file_exists ("img /" datum ("M")))
{
mkdir ("img /" datum ("M"));
}
// ustvarite mapo trenutnega dne
če (! file_exists ("img /" datum ("M"). "/" datum ("d")))
{
mkdir ("img /" datum ("M"). "/" datum ("d"));
}
/// razširitev datoteke
$ path_info = pathinfo ($ _ FILES [`photo1`] ["ime"]);
$ ext = $ path_info [`razširitev`];
/// ustvarite ime datoteke
$ id = md5 (datum ("Y-M-d"));
če (kopija ($ _ FILES [ `photo1 "] [" tmp_name "]," img / ". datum (" M ")." / ". datum (" d ")." / ". $ id. $ ext) )
{
echo ("datoteka je bila uspešno prenesena");
}
vse nadaljnje ukrepe (pisanje v bazo podatkov itd.)
}
Več datotek
Prenos več datotek (PHP) se pojavi z uporabo dodatnih polj v obrazcu.
Ta metoda ni zelo dobra, ker omejuje število datotek za prenos. Poleg tega se šteje za slab ton v programiranju. Poskusite storiti vse dinamično.
Idealna možnost je možnost, da izberete veliko število datotek hkrati s pritiskom na en sam gumb.
Če želite to narediti, oblikujemo obrazec s to kodo.
Upoštevajte, da se doda beseda več, ime pa je podano kot matrika []. V tem primeru bo polje $ _FILES nekoliko drugačno. Dobili boste matriko v matriki.
Za preverjanje lahko znova uporabite var_dump ($ _ FILES);
Vse vaše datoteke bodo nameščene v matriki, kot je ta:
- $ _FILES ["file1"] ["ime"] [0]
- $ _FILES ["file1"] ["ime"] [1]
- In tako naprej.
V oklepajih je zapisana številka datoteke v matriki. Štetje iz nič. Obdelujemo jih na enak način, preprosto nastavite zanko in pri dostopu do zgornje kode na koncu dodamo indeks [$ i].
$ i = 0;
medtem ko ($ _FILES ["file1"] ["ime"] [$ i]<> ``)
{
/// vstavite zgornjo kodo
}
Tako boste morali prenesti datoteke prek PHP v enem ciklu, brez nepotrebnega ponavljanja kode, kot je običajno, če uporabljate možnost statične datoteke (zadnja fotografija).
- Kako postaviti spletno stran na internet?
- Podrobnosti o tem, kaj je na FTP strežnikih
- Kakšne so napake HTTP?
- Kakšna je povezava in kako se uporablja?
- Pregled skupne rabe datotek "Sharemana"
- Priljubljeni prenosniki datotek z interneta
- Kakšni so FTPS in SFTP protokoli?
- FTPS pristanišče - kaj je to?
- Najboljši datotečni upravitelj za iPhone
- Storitev FTP na internetu je zasnovana ... FTP File Transfer Service
- Wgetovi ukazi: primeri. Program konzole za nalaganje datotek prek omrežja Wget
- Kaj je glava http?
- Programi FTP: Pregled strank za Windows
- Iskanje strežnika: kaj je, seznam, prednosti in slabosti
- Arhitektura odjemalec-strežnik
- Tehnologija odjemalec-strežnik
- Skupaj se učimo, kaj je "scenarij"
- FTP protokol
- Kako ustvariti torrent datoteko za predmet iz vašega računalnika
- Kaj je proxy strežnik in za kaj je to?
- Kako ustvariti strežnik FTP sami?