Kompiuteriai, Failų tipai
PHP: failų įkėlimo į serverį
Failų atsisiuntimas per PHP - labai įdomus atvejis, į kurį turi būti vertinamas labai atsargiai. Internete galite rasti daug pavyzdžių iš failo įkėlimo įgyvendinimo, bet ne visi iš jų yra geri ir atitinka saugos reikalavimus.
Tokie dalykai turi duoti išvadą, net jei jis trunka ilgą laiką. Jei paliksite spragą kodą, tada visa jūsų serveris gali būti pažeista.
saugumas
Su PHP failą įkelti į serverį atliekamas gana lengvai. Kodas yra labai trumpas ir paprastas. Tik kelias eilutes. Tačiau šis metodas yra pavojingas. Daug daugiau laiko ir eilučių kodo svečių saugumui.
Kyla pavojus, kad, jei jūs neturite daryti patikrinimus, bet užpuolikas gali atsiųsti savo scenarijus jūsų serveryje. Šiuo atveju, jis turės pilną priėjimą. Jis gali daryti ką jis nori:
- ištrinti duomenų bazę;
- ištrinti failus svetaines;
- keisti failų svetaines;
- pridėti skelbimą į savo interneto svetainėje;
- parsisiųsti virusus;
- nukreipti visus vartotojus apie savo svetaines;
- ir daug kitų dalykų, kurie ateina į galvą, užpuolikas.
Jūs visada turėtų patikrinti, ar bando atsisiųsti failą vartotojui. Pavyzdžiui, jei jūs įkelti tik vaizdus, būtina patikrinti, ar failas yra image tiksliai. Priešingu atveju, jūs nieko atsisiųsti.
Lygiai kaip įgyvendinti patikrinimą, ji bus rodoma, su tiesioginiu tyrimo scenarijų įkelti failus.
Sukurti PHP formą
failų įkėlimo forma yra labai paprasta. Trūksta mygtuką Naršyti ir įkelti mygtukus.
Aprašoma, kaip sukurti formas nebus, nes tai lengva. Tolesni nurodymai daryti prielaidą, kad jūs jau turite pagrindinės sąvokos HTML (kitaip nebūtų ieškote informacijos apie atsisiųsti PHP).
Tačiau pažymi, kad formos duomenys, kuriuos reikia pridėti prie enctype atributas.
Priešingu atveju, duomenys apie failų prižiūrėtojas nebus perduodami.
Kaip tai turėtų veikti?
Po to bus reikalaujama gauti kelią, kur failas yra.
Jei kelias neatrodo, atlikti veiksmą dar kartą.
Paspaudus ant parsisiųsti failų prižiūrėtojas gali suteikti jokios informacijos.
Pavyzdžiui, galite rašyti liniją, kuriame nurodoma, kad failas yra "taip ir taip" pavadinimas buvo sėkmingai įkeltas į "toks ir toks" aplanką. Žinoma, failo pavadinimas bus suteikta visada skirtingi.
Paprastai ši informacija yra naudojama debug kodą. Taigi galima patvirtinti, kad perduodami duomenys ir rašo pasitaiko norimą katalogą. Tai yra, net failo pavadinimas nenurodytas. Nuo šios papildomos informacijos, kad vartotojui nereikia.
Prasminga produkcijos vardą tik tada, jei vartotojas gali atsisiųsti kelis failus. Toks atvejis, mano šiek tiek toliau. Tegul ne gauti prieš save.
reguliavimas
PHP failo įkėlimo į serverį reikalauja tam tikrų nustatymų, kuriuos turėtų būti daroma į php.ini failą. Šis failas yra keletas nustatymų daug. Jie visi mums nereikia. Esame suinteresuoti trijų eilučių: file_uploads, upload_tmp_dir ir upload_max_filesize.
Atkreipkite dėmesį, kad šie nustatymai turės įtakos visus savo svetaines serveryje, o ne tik bet kokią vieną. Todėl, norint nustatyti didžiausią dydį, remiantis tuo, kad turėsite įkelti vartotojams. Tai nėra rekomenduojama, kad nustatytas per didelis.
Kai jūs pakeičiate reikšmes šių parametrų, reikia iš naujo paleisti serverį. Kitaip nustatymai nebus įsigaliotų, kaip jie skaito ne iš serverio krovimosi laikas.
Jūs galite tai padaryti konsolės prijungus per SSH į serverį. Tiesiog įveskite komandą paslaugų httpd iš naujo, tada nustatymai įsigalios.
Kitas būdas - iš naujo, per ISP-skydelyje arba per atsiskaitymo skydelio teikėjo.
masyvo failą
PHP failų įkėlimo daroma masyvo $ _FILES. Ji yra visa informacija apie failus, kad mes atsisiųsti.
Norėdami pamatyti, kokia informacija yra pateikiama masyvo, užtenka parašyti failų prižiūrėtojas po.
Pasirinkite bet kokį failą ir spustelėkite "Įkelti". Apie prižiūrėtojas puslapyje rodys informaciją, kuri yra saugoma $ _FILES. Kintamasis yra parašyta visiškai su didžiosiomis raidėmis. PHP - kalbos raidės.
Kaip matote, šiame masyve yra laukų daug. Visi jie yra svarbūs mums. Pirmasis laukas yra failo pavadinimą į formą, kurioje ji yra naudojama kompiuteryje.
Tipo stulpelis nurodyta failo tipą. Tmp_name laukas atitinka laikino failo vardą. Po scenarijų pabaigoje bus ištrinta.
Klaida lauke yra klaidos kodą. Tai buvo šiek tiek toliau. Dydis - in baitų dydžio.
klaidos
Vykdoma per PHP failo įkėlimo visada lydi klaidos kodą. Klaidos pranešimas įrašyti į "klaida". Ekrano klaida yra nulis.
Apsvarstykite visas klaidas vertė:
Štai pavyzdys forma atsisiųsti failą, kuris rodo, kad įkelto failo dydžio limitą.
PHP: failą įkelti scenarijų
Kaip viskas vykdoma praktikoje? PHP failų įkėlimo atsiranda kopijavimo komandą. Jei jus domina tai, kaip atsisiųsti failą klausimą, atsakymas yra paprastas, autorinių teisių, kuri naudoja du parametrus - šaltinio failo ir paskirties failas.
Tačiau, kaip jau minėta, jis negali būti apribotas saugumo sumetimais. Pavyzdžiui, patikrinkite, kokios bylos mes laivas, galite naudoti lauko tipo masyvo $ _FILES. Pirma, galime spręsti patikrinimo, tada pereiti į pilną scenarijų
Tarkime, jūs norite, kad vartotojai galėtų įkelti nuotrauką su iš tik GIF, JPEG ar PNG rezoliucijos. Nurodykite jis gali būti panašus į šį.
if ($ _ failai [ 'file_upload'] [ 'tipo']! = "image / gif) {
echo "Atsiprašome, mes palaiko tik atsisiųsti GIF-Files";
išeiti;
}
Jei norite išsiųsti visų 3 tipų, tiesiog pridėti papildomą sąlygą į kitos rūšies įvaizdžio.
Kopijavimas yra daroma, kaip šis: copy (image 1 image 2).
Mūsų atveju, kai darbas yra atsisiųsti iš kompiuterio į serverį, tai galite padaryti
kopiją ($ _ failai [ 'file_upload'] [ "tmp_name"], "1.jpg")
Tai reiškia, kad failas bus nukopijuotas, kurių pavadinimas 1.jpg. Tai nėra visiškai teisinga. Šiuo atveju, tai tik pavyzdys. Failo pavadinimas yra visada būtina nurodyti skirtingi, ir nurodyti pratęsimo, priklausomai nuo failo.
Nustatyti pratęsimas gali būti įvairiais būdais. Viskas priklauso nuo erudicijos kūrėjas. Vienas iš greičiausių būdų (iš dešimtosiomis sekundės skirtumas) nustatyti pratęsimo - tai kitą kodą.
$ PATH_INFO = pathinfo ($ _ failai [ 'photo1'] [ "vardas"]);
$ Tel = $ PATH_INFO [ 'išplėtimas'];
Kintamasis $ EXT mes laikyti norimą plėtinį. Bylos pavadinimas gali būti nustatomas atsitiktinai, naudojant MD5. Jei planuojate atsisiųsti daug failų, tai geriau atsiųsti jas į skirtingus aplankus. Taigi tai bus patogiau. Visų pirma, jei norite išvalyti.
atsisiųsti kodas bus taip.
/// Su nuotrauka
if ($ _FILES [ 'photo1'] [ 'tmp_name'] == NULL)
{
aidas ( "
Nežinomas failo." strong> p>
išeiti; } ///. Pasakykite, kad už bet kokį projektą serveryje leidžiama įkelti didelius failus (video), bet yra tik nuotraukos, o vartotojai turi apriboti jei (($ _FILES [ "photo1"] [ "dydis"]> 1024 * 1024 * 2) { ?> didžiausias leidžiamas dydis 2 MB strong> išeiti; } // sukurti katalogus // sukurti einamojo mėnesio aplanką if (! file_exists ( "img /". data ( "M"))) { mkdir ( "img /" data ( "M").); } // sukurti dabartinės dieną aplanką if (! file_exists ( "img /". data ( "M"). "/". data ( "D"))) { mkdir ( "img /" data ( "M") "/" data ( "D") ...); } /// failo plėtinys $ PATH_INFO = pathinfo ($ _ failai [ 'photo1'] [ "vardas"]); $ Tel = $ PATH_INFO [ 'išplėtimas']; /// generuoti failo $ Id = md5 (data ( "YMD")); jei (kopija ($ _ failai [ 'photo1'] [ "tmp_name"], "IMG /". data ( "M"). "/". data ( "D"). "/". $ id. $ EXT) ) { aidas ( "Failas sėkmingai įkeltas"); } /// imtis tolesnių veiksmų (įrašas duomenų bazėje, ir pan. N.) } Siuntimas kelis failus (PHP) įvyksta naudojant papildomus formos laukus. Šis metodas nėra labai gera, nes ji riboja failus atsisiųsti skaičių. Be to, manoma, blogai forma programavimą. Pabandykite padaryti viską dinamiškas. Idealus variantas - tai yra daug failų vienu metu pasirinkimas paspaudus vieną mygtuką. Norėdami tai padaryti, sukurti, kaip šiuo kodu formą. kelis failus
P>
Form>
Atkreipkite dėmesį, kad kelių to žodžio, o vardas yra pateikiamas kaip masyvą []. Šiuo atveju $ _FILES masyvas bus šiek tiek kitoks. Jūs gausite masyvo masyvas.
Išbandyti galite vėl naudoti var_dump ($ _ failai);
Visi jūsų failai bus patalpinti į masyvą, kaip tai:
- $ _FILES [ "failas1"] [ "vardas"] [0]
- $ _FILES [ "failas1"] [ "vardas"] [1]
- Ir taip toliau.
Skliaustuose parašyta bylų skaičių masyvą. Skaičiuojant nuo nulio. Mes su jais elgtis lygiai taip pat, tiesiog paprašykite ciklą ir susisiekus su pirmiau aprašyta kodą indekso pridedant [$ i] pabaigoje.
$ I = 0;
o ($ _FILES [ "failas1"] [ "vardas"] [$ i] <> '')
{
/// įklijuokite šį kodą
}
Taigi, jūs turite, kad taip atsitiktų per PHP failo įkėlimo į vienos ciklo serverio be nereikalingų pakartotinių kodas, kaip paprastai atsitinka, jei jūs naudojate versiją su statinio skaičius failus (Paskutė nuotrauka).
Similar articles
Trending Now