Loading failus uz serveri, izmantojot PHP. Failu lejupielāde serverī (augšupielāde) PHP Kā lejupielādēt PHP failu

Protams, jūs bieži lejupielādējiet dažādus failus vietnēs. Piemēram, augšupielādēti avatāri forumā, Fotogrāfijas uz sociālajiem tīkliem, dažādiem video uz video resursdatoriem, tikai failus uz failu koplietošanu. Un šeit šajā rakstā jūs uzzināsiet kā augšupielādēt failus uz serveri PHP. Tas ir cauri PHP. Vairumā gadījumu tas tiek īstenots.

Pirmkārt, ko mācīties ir tas pats HTML formakurā fails ir aizvietots, jābūt ne gluži normālam, šeit ir piemērs Html kods Šāda forma:





Galvenais punkts ir atribūts " enctype."Ar nozīmi" multipart / veidlapas dati". Nedarbināsies bez tā.

"Kurā mēs joprojām neplānojam failu, un mēs nodosim nedaudz dažādiem svarīgiem punktiem, kas jāņem vērā, pretējā gadījumā drošība var ietekmēt: \\ t

Print_r ($ _ faili);
?>

Tā rezultātā jūs redzēsiet saturu. globālā divdimensiju masīva $ _Files:

  • nosaukums. - lejupielādētā faila nosaukums.
  • veids - Mime tipa Lejupielādējams fails. Tas, iespējams, ir vissvarīgākais drošības parametrs. Un vienmēr, kad ir jāpārbauda faili Mime tipaPretējā gadījumā nav problēmu. Nākamajā rakstā mēs par to runāsim sīkāk.
  • tmp_name. - fiziskais ceļš uz pagaidu failu. Tas ir šajā vietā, ka fails ir novietots, un tikai tad mēs to pārvadāt uz citu vietu. Faktiski fails jau ir ielādēts, un mums tas tikai jāpārvieto uz vēlamo mapi serverī.
  • kļūda - kļūdas kods. Ja 0 , Nav kļūdu.
  • izmērs - lejupielādētā faila izmērs. Tas ir arī bieži izmantotais variants, un tas būtu jāpārbauda arī ierobežojiet lejupielādēto failu lielumu. Protams, šis lielums pats ir ierobežots, tomēr attiecībā uz jebkuriem attēliem šis izmērs ir nepārprotami (kā likums, viņš 10 mb).

Un visi šie parametri ir klāt katram lejupielādējamam failam (katrs no tiem ir masīvs divdimensiju masīvā. $ _Files.).

Tagad beidziet ar lejupielādējiet failus serverī PHPUn par to mēs rakstīsim šādu kodu ("):

$ UploadFile \u003d "Images /".$_ faili [" Somename "] [" Vārds "];
Pārvietot_uploaded_file ($ _ faili ["Somename"] ["tmp_name"], $ UploadFile);
?>

Tas ir, sākumā mēs norādīsim ceļu uz lejupielādējamo failu serverī. Šeit mēs vēlamies ievietot failu direktorijā " attēli"Ar tādu pašu nosaukumu, kas bija pirms faila. Un funkcija pārvietot_uploaded_file () Mēs pārvietojam failu uz direktoriju tās izvēlēto direktoriju no pagaidu uzglabāšanas.

Tomēr pievērsiet uzmanību, tas ir ļoti svarīgi! Tāpēc izmantojiet kodu nekādā gadījumā, citādi jūsu vietnē apdraud nopietnas briesmas! Faktiski, brīdī to var lejupielādēt absolūti neatkarīgi no visiem izpildāmiem failiem, skriptiem, Html panna Un citas ļoti bīstamas lietas. Tāpēc ir nepieciešams rūpīgi pārbaudīt lejupielādējamos failus serverim. Un tāpēc mēs darīsim nākamajā rakstā. Tā kā tēma ir ļoti svarīga, tad es ieteiktu jums abonēt atjauninājumus, lai nepalaistu šo rakstu.

Jūsu pārlūkprogrammā ir bloķēts JavaScript. Ļaujiet JavaScript vietnes darbam!

Ielādējot failus uz serveri

Īsas izgriešanas augšupielādē

Kas ir augšupielādes faili vai kāpēc nedarbojas
kopēt ("c: \\ bys.jpg", "http://mysite.ru/uploads/sample.jpg")

Pat ja jūsu rīcībā ir tikai viens dators, uz kura serveris un darbstacija ir izlīdzinātas, neaizmirstiet, ka PHP izmanto klienta / servera tehnoloģiju. Fails, ko mēs vēlamies augšupielādēt, parasti atrodas klienta automašīnā, t.i. Lietotājs, parastais vietnes apmeklētājs. Galamērķis ir serveris. Lai veiktu failu pārsūtīšanas procesu, mums ir vajadzīga šāda forma:

Nosūtīt šo failu:

Šajā gadījumā jūsu PHP skripta URL jānorāda darbības jomā, kas turpinās apstrādāt lejupielādētos failus. Hidden Max_File_size laukam jābūt pirms failu izvēles lauka, un satur maksimāli pieļaujamo faila lielumu baitos. Tās uzdevums ir pārbaudīt faila lielumu, līdz fails tiek nosūtīts uz serveri. Tai vajadzētu saglabāt lietotāju no ilgu un neveiksmīgu faila lejupielādi serverim un lieko satiksmes veidošanai, bet nevajadzētu būt īpaši paļautejam uz šo ierobežojumu, jo tas ir viegli, lai to apietu.

Kas notiek, kad lietotājs izvēlējās failu savā diskā un nospiežot pogu "Sūtīt failu"? Pārlūks nosūta failu uz serveri, kurā PHP tulks ievieto to savā pagaidu direktorijā, piešķirot to nejaušu nosaukumu un izpilda darbības laukā norādīto skriptu.

Kā vajadzētu augšupielādēt.php izskatās?

$ Uploaddir \u003d "/ var / www / augšupielādes /"; ja (pārvietot_uploaded_file ($ _ faili ["userfile"] ["tmp_name"], $ Uploaddir. $ _Files ["UserFile"] ["Vārds"])) (drukas "fails ir derīgs un veiksmīgi augšupielādēts.";) Cits (izdrukāt "tur dažas kļūdas!";)

Rakstot skriptu, rodas dabisks jautājums: kā iegūt informāciju par lejupielādēto failu un sasniegt pašu failu. Ja izmantojat PHP versiju 4.1.0 un vecāki, vislabāk būs atsaukties uz globālo $ _files masīvu. Katram lejupielādētajam failam tas satur hash masīvu, ar šādiem datiem:

  • $ _Files ["userfile"] ["Vārds"] - sākotnējais faila nosaukums, piemēram, lietotājs to redzēja, izvēloties failu;
  • $ _Files ["userfile"] ["Tips"] - Piemēram, MIME / tipa fails var būt attēls / gif; Šis lauks ir noderīgs, lai saglabātu, ja vēlaties sniegt interfeisu lejupielādēto failu lejupielādei;
  • $ _Files ["userfile"] ["Izmērs"] - lejupielādētā faila lielums;
  • $ _Files ["userfile"] ["tmp_name"] - pilnu ceļu uz pagaidu failu uz diska;
  • $ _Files ["userfile"] ["Kļūda"] - Sākot ar versiju 4.2.0, ir kļūdas kods, kas ir 0, ja darbība ir veiksmīgi nodota.

PHP versijai zem 4.1.0, šo masīvu sauc par $ http_post_files. Neaizmirstiet, ka, atšķirībā no $ _files, šis masīvs nav superglobāls un piekļūstot tam, piemēram, no funkcijas, ir nepieciešams skaidri norādīt globālo $ http_post_files;

Ja papildu mainīgie no $ userfile_name, $ userfile_type, $ userfile_size, $ userfile_type, $ userfile_type, tiks izveidots jūsu reģistra_globālu iestatījumos \u003d Ieslēgts, ņemot vērā, ka, sākot ar versiju 4.2.0, noklusējuma iestatījumi REGLEEGE_GLOBALS \u003d Šo mainīgo izmantošana nav ieteicama, pat ja tās definē. Labākais veids, kā iegūt informāciju par lejupielādētajiem failiem, ir izmantot $ _files masīvu.

Lai strādātu ar lejupielādētiem failiem, vislabāk ir izmantot iebūvētās funkcijas is_uploaded_file () un pārvieto_uploaded_file (), kas pārbauda, \u200b\u200bvai fails ir ielādēts, un ievieto to attiecīgi norādītajā mapē. Jūs varat atrast detalizētāku informāciju par manuālajām lapām. Tas nav nepieciešams, lai izgudrotu velosipēdu un strādāt ar pagaidu failiem pats, kopēt tos, dzēst. Tas jau ir darīts ar jums un jums.

Servera tuning

Es darīju visu pareizi, bet kaut kas nedarbojas man. Varbūt man ir nepareizi konfigurēts serveris?

Ja jūs "darījāt visu pareizi", bet jūsu kods nedarbojas, vai tas darbojas nepareizi, nav jāsteidzas izmisums. Iespējams, šī problēma nav jūsu rokās, bet nepareizā servera iestatījumos. Šeit ir saraksts ar direktīvām, kas saistītas ar lejupielādes failiem:

PHP.ini failā:

  • Ja jūs vēlaties zināt, kur atrodas jūsu php.ini, veiciet
  • file_uploads. - spēja aizliegt vai atļaut lejupielādēt failus kopumā. Noklusējums.
  • upload_max_Filesize - Maksimālais faila lielums, ko var lejupielādēt. Ja jums ir nepieciešams strādāt ar lieliem failiem, mainīt šo iestatījumu. Pēc noklusējuma 2m Neaizmirstiet mainīt post_max_size.
  • post_max_size. - pēc pieprasījuma nosūtīto datu augšpusē. Ja jums ir nepieciešams strādāt ar lieliem failiem vai vienlaicīgi nosūtīt vairākus failus, mainīt šo iestatījumu. Noklusējuma vērtība ir 8m.
  • augšupielādēt_tmp_dir. - Pagaidu direktorija serverī, uz kuru tiks ievietoti visi lejupielādējamie faili. Pārbaudiet, kuras tiesības ir noteiktas uz to (ja jums ir grūtības šajā posmā, skatiet paskaidrojumu beigās rakstu). Šādam direktorijai ir jābūt arī lietotājam, saskaņā ar kuru tiek veikta Apache, ir jābūt arī tiesības rakstīt uz šo direktoriju. Ja jūs strādājat ar iespējotu Open_basedir ierobežojumu - tad pagaidu direktorijā jābūt iekšā. Jums nav jārūpējas par viņas tīrīšanu vai unikāliem nosaukumiem, PHP atrisina šo problēmu jums.

Failā httpd.conf.:

  • Pirmkārt, pārliecinieties, ka jūs izmantojat Apache 1.3 tīmekļa serveri (jaunāko versiju rakstīšanas laikā - 1.3.27). Ja lietojat Apache 2.0, jums vajadzētu izlasīt šādu izvilkumu no dokumentācijas:

    Nelietojiet Apache 2.0 un PHP ražošanas vidē, ne arī Unix, ne uz Windows.

  • Ja esat saņēmis ziņu "Post Metode nav alloded", tas nozīmē, ka jums ir nepieciešams meklēt kaut ko līdzīgu šādām direktīvām, un izmantot atslēgvārdu atļaut: Pasūtījums atļaut, liegt atļaut no visiem
  • Problēmas ar bināro failu lejupielādi - klasiskais jautājums "Kāpēc faili cīnās augšupielādē". Šeit ir risinājums Dima Borodin (http://php.spb.ru) ierosinātajam lēmumam: direktorijā, kur skripts atrodas, veiciet .htaccess failu, kurā mēs rakstām: charsetidisable uz failu httpd.conf. Pievieno rindas: Charsetrecodemultipartforms off

Mazie paskaidrojumi, uz šo recepti: iepriekš minētā problēma, kad servera ielādētie arhīvi nav neapmaksāti un attēli netiek rādīti, tas var rasties, jo tiek izmantots Krievijas Apache tīmekļa serveris. CharsetDisable direktīva atspējo Charset apstrādes moduļa moduli, t.i. Neviens pārkodējums, lejupielādējot failus, kas atrodas šajā mapē, nenotiks. CharsetRecodeMultipartForms direktīva izslēdz datu transkodu, ko nosūta Post Metode ar satura tipu: Multipart / Form-Data Header. Tiem. Binārie dati, kas pārraidīti ar šādu iestatījumu, tiks atstāti oriģinālajā formā, un visas pārējās vietnes uzpildes tiks pārskaitītas atbilstoši pašreizējiem servera iestatījumiem.

Bet tajā pašā laikā var rasties komplikācijas: Esiet gatavs faktu, ka dažos gadījumos pieprasījumu teksta daļas jums būs jāpārrēķina sevi. Tas ir tas, ko dokumentācija par to teica:

Izmantojiet CharsetRecodeMultipartForms direktīvu, kas parādījās PL23, bet jums vēl ir jāatjauno manuāli teksta daļas daļas. Lai to izdarītu, jūs varat izmantot Krievijas Apache API, kas pieejams citos moduļos vai krievu Apache Perl API, kas pieejams no Mod_perl.

Viens no kodēšanas definīcijas piemēriem var atrast šeit: http://tony2001.phpclub.net/detect_charset/detect.phps

Jaunākie dokumenti par Krievijas Apache ir tās oficiālajā tīmekļa vietnē: http://apache.lexa.ru/.

Neaizmirstiet, ka pēc jebkādas konfigurācijas maiņas jums ir nepieciešams restartēt jūsu tīmekļa serveri.

Varat arī konfigurēt Apach parametrus, izmantojot.htaccess:

Php_value upload_max_filesize 50m php_value post_max_size 50m

Papildus iespējas

Ielādējot vairākus failus tajā pašā laikā

Vairāku failu lejupielādes formas piemērs:

Nosūtīt šos failus:


Un neaizmirstiet palielināt post_max_size.Ja ir paredzēts daudz failu

Automātiski lejupielādējiet failus serverī

Jums nevajadzētu aizmirst, ka lietotāja diska faili ir konfidenciāla informācija, uz kuru ne JavaScript, ne tik daudz vairāk PHP ir zemas attiecības. Līdz lietotājs izvēlējās failu ar palīdzību Neatkarīgi no tā, kāds darbs ar viņu var iet un runā. Un neaizmirstiet, ka šis lauka ievades lauks ir vērtības atribūts ir aizsargāts no ierakstīšanas.

Failu glabāšana MySQL datu bāzē

Ja esat savākts, lai uzglabātu lejupielādējamus failus datubāzē, jums ir jāatceras šādi punkti:

  • Jums jāizmanto lāse lauks
  • Pirms datu bāzes ievietošanas neaizmirstiet pieteikties uz mysql_escape_string () virkni
  • Rāda failu, jānorāda satura / tipa galvene

Atcerieties, ka skripts parāda jūsu HTML, kas nav savienots ar skriptu, ka attēlam jāizieta. Tiem jābūt divām dažādām lietojumprogrammām.

Attēlu uzglabāšana datu bāzē nav labs stils. Datubāzē ir daudz ērtāk glabāt tikai attēlu failiem.

Attēlu rekvizītu iegūšana.

Ja jums ir uzdevums pārbaudīt attēla tipu vai izmēru pirms faila lejupielādes serverī, jums būs nepieciešama getimageize () funkcija. Kā arguments, tā pieņem faila nosaukumu uz diska un atgriež masīvu, pirmos divus elementus, kas ir attiecīgi platums un augstums, trešais ir attēla veids. Ja nav iespējams izlasīt pareizo attēlu no norādītā faila, funkcija atgriež meli.

Ielādējot failus ar krievu valodas nosaukumu

Lejupielādējot servera failā, jums ir jāpārbauda to sākotnējie nosaukumi, lai klātbūtni "nestandarta" rakstzīmes (piemēram, krievu burti). Attiecībā uz viņu klātbūtni, tas ir nepieciešams, lai aizstātu. Sākotnējais faila nosaukums var atrast $ _files ["Userfile"] ["Vārds"] mainīgais. Kā uzlādēt krievu valodas virkni, lai tulkotu jūs varat atrast PHP piemēros.

Lejupielādēt statusa displeju (Progresa josla)

Ir jāpatur prātā, ka, līdz fails ir pilnībā lejupielādēts, PHP nevar darboties vai faila lielumu vai tās iekraušanas procentuālo daļu. Tikai tad, kad fails jau ir uz PHP servera, tas varēs piekļūt informācijai. Ja jums joprojām ir nepieciešams, lai īstenotu šādu iespēju, izmantojiet Java-Applet.

Tiesības uz failiem

Problēmas ar tiesībām uz servera (Upload_tmp_dir)

ANOIX līdzīgu operētājsistēmās, katra mape, fails, saite ir iestatīta atbilstību atļaujām. Tie var izskatīties kā rwx-rw-r- vai kā skaitlis 754.

Faila vai direktorijas pieejamība ir atkarīga no lietotāja ID un grupas identifikatora, kurā tas nonāk. Režīms kopumā ir aprakstīts trīs secībās, trīs burti:

Īpašnieks cita grupa (U) (g) (o) rwx rwx rwx

Šeit īpašniekam, grupas locekļiem un visiem citiem lietotājiem ir tiesības lasīt failu, rakstīt uz to un tā izpildi. Tiesības - jebkura nozīmīga šādu burtu kombinācija:

r tiesības lasīt. (četri)
W Tiesības reģistrēt. (2)
x Tiesības uz izpildi (meklēt katalogā). (viens)

  • Instalējiet lietotāja kataloga īpašnieku, kuru atrakcijas veic Apache. To var atrast no httpd.conf faila vai apskatīt sarakstu procesus uz servera. Direktoriju tiesībām jābūt 700 (RWX -------).
  • Neatkarīgi no tā, kas īpašnieks katalogu, nosaka tiesības 777 (rwxrwxrwx).

    Piemērs, lai ieviestu attēlu lejupielādes serveri.

    $ max_Image_width \u003d 380; $ max_Image_height \u003d 600; $ max_Image_size \u003d 64 * 1024; $ order_types \u003d masīvs ("GIF", "JPG", "PNG", "JPEG"); ja (sset ($ _ faili ["userfile"))) (ja (is_uploaded_file ($ _ faili ["userfile") ["tmp_name"])) ($ filename \u003d $ _files ["userfile"] ["tmp_name"] $ Ext \u003d substr ($ _ faili ["userfile"] ["Vārds"], 1 + StrRPOS ($ _ faili ["UserFile"] ["Vārds"], "")); ja (failu fails ($ filename)) )\u003e $ MAX_IMAGE_SIZE) (ECHO "KĻŪDA: Faila izmērs\u003e 64k.";) ElseIf (! In_array ($ ext, $ order_Types)) (ECHO "Kļūda: nederīgs faila veids.";) cits ($ lielums \u003d getimageize ($) Filename); ja (($ lielums) && ($ lielums)< $max_image_width) && ($size < $max_image_height)) { if (@move_uploaded_file($filename, "/www/htdocs/upload/")) { echo "File successful uploaded."; } else { echo "Error: moving fie failed."; } } else { echo "Error: invalid image properties."; } } } else { echo "Error: empty file."; } } else { echo "
    Nosūtīt šo failu:
    "; }
  • Mūsu rakstā mēs apsveram piemēru, kā izveidot PHP failu lejupielādes skriptu uz serveri. Mūsu vienkāršajam failu lejupielādes piemēram būs 2 faili: veidlapa (Form.html), PHP failu lejupielādes skripts (Uploader.php).

    Tagad mēs analizēsim visu detalizēti. Vispirms analizējiet formu.html failu:


    Kā jūs varat redzēt šo vienkāršo HTML kodu, šeit nav nekas sarežģīts, vienīgais, ja veidlapa ielādēs failus serverī, tad atribūts ir jāreģistrē enctype \u003d "multipart /form-dati.

    Mūsu veidlapa izskatīsies šādi:

    PiemērsPHP failu lejupielādes skripts

    Tagad mēs to izdomāsim ar PHP failu, kas lejupielādēs failus serverī. Zemāk ir tā pirmkods:

    // Ja fails tiks ievietots $ TARVIC_PATH \u003d 'UPLOADED_FILES / "; / * Pievienojiet oriģinālo faila nosaukumu mūsu mērķa ceļam. Rezultāts ir" Uploaded_files / filename.Extension "* / $ TARGET_PATH \u003d $ TARGET_PATH. Faili ["File"] ["Vārds"]); ja (kustība_Uploaded_file ($ _ faili ["File"] ["TMP_NAME"], $ TARGET_PATH)) (atbalss "Fails". Baseename ($ _ faili ["Fails) "] [" Vārds "])." Ir augšupielādēts ";) cits (atbalss" ir kļūda, augšupielādējot failu, lūdzu, mēģiniet vēlreiz! ";)

    Kā PHP failu lejupielādes skripts?

    uploader.php ir vienkāršs PHP failu lejupielādes skripts uz serveri, kas lejupielādēs mūsu failus konkrētā vietnes direktorijā, kas ir norādīts $ TARGET_PATH \u003d "UPLOADED_FILES /" virkne;

    Nu, pati par sevi, mēs izgatavojam elementāru produkciju ziņojumus, izmantojot, ja / cits, tas bija skaidrs, mūsu fails ir ielādēts vai nē.

    Hacker hacking aizsardzība, lejupielādējot failu

    Mēs apsvērsim ne tikai aizsardzību ziņā hakeru hacking, bet arī citas nevēlamas problēmas, kas radušās, lejupielādējot failus uz serveri.

    PHP failu apvalks

    Šī ir pirmā problēma, kas saistīta ar failu lejupielādi serverī. Kad lejupielādes failā ir PHP apvalks, un tas nenozīmē, ka tā paplašinājums būs PHP. Tas var būt skats image.jpg (.gif, .png ...). Bet iekšā izskatās šādi:

    Daži amatnieki var izpildīt komandas uz servera, izmantojot URL sērfošanu:

    $ Čokurošanās http: //server/uploads/shell.php? Komanda \u003d any_unix_command

    Aizsardzības metode:

    Lai aizsargātu, varat ieviest MIME failu pārbaudi. Zemāk redzams piemērs:

    Ja ($ _ faili ["File"] ["Type"]! \u003d "Image / Gif") (atbalss "Atvainojiet, mēs visi visi augšupielādēt GIF attēlus"; izeja;)

    Šis PHP koda gabals pārbauda, \u200b\u200bvai lejupielādējamais GIF fails ir fails. Ievietojiet šo kodu pirms PHP faila lejupielādes skripts. Protams, jūs varat mainīt jpg pārbaudi, PNGI citus nepieciešamos failus.

    Ir patiesība teikt, un šo aizsardzības metodi var apiet, ja sūtāt galvenes galveni, ar MIME instrukcijām. Lai to izdarītu, ir nepieciešams pārbaudīt pieejamību Tagi lejupielādējamā failā.

    Ierobežojot lejupielādētā faila lielumu

    Var būt arī problēmas ar lieliem failiem, kas aizņems jūsu diska vietu. Lai to izdarītu, ierakstiet limitu uz lejupielādētā faila lieluma.

    To var izdarīt, izmantojot veidlapu, lai tas būtu jāpievieno šāda līnija kontekstam HTML veidlapu:

    Šis slēptais ievades lauks ierobežos lejupielādējamās faila lielumu. Vai arī varat pārbaudīt PHP rīku faila lielumu.

    Rakstiet O.pHP failu lejupielādes skripts var būt garš, bet mēs jau esam izjaukuši failu lejupielādes pamatprincipu serverī. Tāpēc, ja kādam ir vairāk jautājumu, jautājiet viņiem komentāros.

    Šodien failu lejupielādes pakalpojums serverim (hostings) ir atrodams visās sociālo tīklu vietnēs, biļetenu dēļiem, iepazīšanās vietnēs utt. Būtība ir ļaut apmeklētājam tīmekļa resursu publicēt savus failus (fotoattēlus, dokumentus) internetā.

    Sniedzot šo pakalpojumu, ir viens būtisks mīnus. Fakts ir tāds, ka, ļaujot lejupielādēt failu uz jūsu serveri, mēs, kā tas bija, uzstādiet durvis, aiz kurām ir nepieciešama pastāvīga kontrole. Tā kā apmeklētāja failā var būt ne tikai noderīga informācija, bet arī vīrusu kods, kas vēlāk var ļaut uzbrucējiem uzņemties jūsu serveri. Ņemot vērā šo mīnus, pirms lejupielādes uz serveri ir rūpīgi jāpārbauda faili.

    Bet es jums neiedūpošu, bet es drīzāk iedomāties, ka jūsu uzmanība jau ir gatava funkcija (PHP skripts), lai pārbaudītu un lejupielādētu failus uz serveri. Funkcija ir 100% strādā. Es pats to izmantoju savās vietnēs. Šī funkcija ir rakstīta attēlu failu (fotoattēlu) lejupielādei format.jpg, .gif, .png. Bet, ja vēlaties, varat veikt izmaiņas PHP skripta pielāgošanai savām vajadzībām.

    PHP skriptā tiek īstenotas divas pārbaudes:

    1. tā kā darbinieks ierobežo lejupielādētā faila lielumu (šo materiālu rakstīšanas laikā man ir 8 MB ierobežojums manā hostēšanā), pēc tam ir nepieciešams pārbaudīt maksimālo lielumu;
    2. faila paplašinājuma pārbaude ļauj nogriezt nevajadzīgus failus pirms lejupielādes.

    Es ceru, ka funkciju kods ir pietiekami izskaidrots, lai risinātu servera lejupielādes failu. Bet, ja jums ir kādi jautājumi, es labprāt atbildēsim komentāros.

    Tagad par to, kā to īstenot praktiski

    Mēs ievietojam PHP koda funkciju atsevišķā failā: funkcija.php un novietojiet to serverī saknes direktorijā.

    Un izveidojiet HTML failu, lai ievietotu fotoattēlu lejupielādes formu: index.html

    upload.php - File Form Handler
    Vārds \u003d "poga" - pogas nosaukumu, noklikšķinot uz kura faila lejupielādes funkcija ir sākta serverī

    Vairāku failu ielāde

    Tagad mēs analizēsim gadījumu, kad jums ir nepieciešams lejupielādēt vairākus failus uz serveri.
    Lai to izdarītu, mums ir nepieciešams funkciju.php failu atjaunināšana.php un index.html veikt dažas izmaiņas.





    Iespējams, tas viss ir nepieciešams, lai īstenotu pakalpojumu, lai lejupielādētu lietotāja failu serverī (hostings).

    Vēl viena iezīme, kas ir cieši saistīta ar grafisko failu lejupielādi (foto), ir funkcija, lai mainītu attēlu lielumu:

    Multipart formas

    • Pasta pakalpojumu tīmekļa ierfaces, kas ļauj pievienot pieteikumu vēstulei (pievienot), un par to vispirms ir nepieciešams lejupielādēt failu uz serveri, un tikai pēc tam to var pievienot vēstulei;
    • Interaktīvas foto galerijas un fotoalbumus, kas nevar pastāvēt bez failu lejupielādes mehānisma uz serveri;
    • Bezmaksas programmatūras portāli, kas tiek izmantoti dažādu programmu failu apmaiņai, utt.

    Faila lejupielāde serverī tiek veikta, izmantojot Multipart -Form, kurā ir failu ielādes lauks. Encotype parametrs norāda Multipart / veidlapu datus:



    Tas izskatīsies kā konkrēta daudzpartiju forma, kas izskatīsies (jūs varat mēģināt redzēt rezultātu daudzpartijas formas, lejupielādējot kādu nelielu failu serverī):

    Multipart formas parasti izmanto pēc pārraides metodi. Kā redzams no iepriekšējā piemērā, šai veidlapai ir divi lauki:

    • Failu izvēles lauks lejupielādei ;
    • Lauks, kurā norādīts faila nosaukums, kas tai būs jābūt serverī .

    Multipart formas apstrāde

    Pirms turpināt rakstīt daudzpartijas veidlapas apstrādes skriptu, jums ir nepieciešams rediģēt konfigurācijas failu php.ini. Lai ļautu lejupielādēt failus uz serveri.

    PHP PHP.ini konfigurācijas failā ir trīs parametri, kas saistīti ar failu lejupielādes serveri:

    • file_uploads \u003d ON - ļauj lejupielādēt failus uz serveri, izmantojot HTTP protokolu;
    • upload_tmp_dir \u003d / TMP - nosaka direktoriju uz laiku uzglabāt lejupielādētos failus;
    • upload_max_Filesize \u003d 2m - nosaka lejupielādēto failu maksimālo daudzumu.

    Ja jūsu tīmekļa serveris vada Linux operētājsistēmu, jums ir nepieciešams atsākt pakalpojumu:

    pakalpojums httpd restartēšana.

    Kā PHP rokturis Multipart formas? Pēc faila saņemšanas tas saglabā to augšupielādēt_tmp_dir pagaidu direktorijā, faila nosaukums tiek izvēlēts nejauši. Tad tas rada četrus superglobālas masīva $ _files mainīgos lielumus. Šajā masīvā ir informācija par lejupielādēto failu.

    Mainīgie, kas definēti lejupielādētiem failiem, ir atkarīgi no PHP versijas un pašreizējā konfigurācija. Superglobal $ _Files masīvs ir pieejams no PHP 4.1.0. Gadījumā, ja konfigurācijas direktīva ir noteikts pēc vērtības uz.papildus tiks deklarēti mainīgie ar atbilstošiem nosaukumiem. Sākot ar versiju 4.2.0, noklusējuma vērtība Register_globals opcija ir izslēgt.

    Par $ _files masīvu mūsu piemērā saturs ir dots zemāk. Lūdzu, ņemiet vērā, ka tiek pieņemts, ka izmanto UploadFile nosaukumu failu atlases jomā, saskaņā ar iepriekš minēto Multipart formu. Protams, lauka nosaukums var būt jebkurš.

    • $ _Files ["UploadFile"] ["Vārds"] - faila nosaukums pirms to nosūtīšanas uz serveri, piemēram, pict.gif;
    • $ _Files ["UploadFile"] ["Izmērs"] - saņemtā faila lielums baitos;
    • $ _Files ["UploadFile"] ["Tips"] - Saņemtā faila mime (ja pārlūks varēja to noteikt), piemēram: Image / GIF, attēls / PNG, attēls / JPEG, TEXT / HTML;
    • (Tātad mēs sauca failu lejupielādes lauku) - satur faila nosaukumu pagaidu direktorijā, piemēram: / tmp / phpv3b3qy;
    • $ _Files ["UploadFile"] ["Kļūda"] -Kļūdas kods, kas var rasties, kad fails ir ielādēts. Atslēga ["Kļūda"] Tas tika pievienots PHP 4.2.0. Ar atbilstošiem kļūdu kodiem jūs varat iepazīties ar sevi

    Pēc skripta pabeigšanas tiks dzēsts pagaidu fails. Tas nozīmē, ka mums tas ir kopēt to uz citu vietu, līdz skripts ir pabeigts. Tas ir, algoritms darba scenārijam faila lejupielādei uz serveri ir:

    Ja tiek nospiests poga "Iesniegt", fails jau tiks lejupielādēts serverī, un tā nosaukums būs $ _files ["UploadFile"] ["Vārds"] mainīgais. Šādā gadījumā skriptam ir nekavējoties kopēt nosaukumu nosaukumu $ _Files ["UploadFile"] ["TMP_NAME"] Uz kādu katalogu (jums ir nepieciešams rakstīt uz šo direktoriju).

    Failu kopēšana tiek veikta pēc funkcijas kopija () :

    Izmantojiet tikai kopiju () kopiju () funkciju, nevis pārvietojas, jo:

    • Pagaidu fails tiks automātiski noņemts;
    • Ja pagaidu direktorija ir citā datu nesējā, tiks parādīts kļūdas ziņojums.

    Pieņemsim, ka mums ir nepieciešams lejupielādēt failu uz augšupielādes direktoriju, kas atrodas Web servera saknes direktorijā (Dokumentu direktorijā).

    // tikai gadījumā, izveidojiet direktoriju. Ja viņš jau ir izveidots,
    // kļūdas ziņojums Mēs neredzēsim, jo \u200b\u200bmēs izmantosim @ operatoru:

    @mkdir ("augšupielādes", 0777);

    // Kopēt failu no / TMP augšupielādēs
    // faila nosaukums būs tāds pats kā pirms nosūtīšanas uz serveri:

    Kopēt ($ _ faili ["UploadFile"] ["TMP_NAME"], "Augšupielādes /". Baseename ($ _ faili ["UploadFile"] ["Vārds"]);

    Linux, viss ir daudz sarežģītāks - mums ir jāņem vērā piekļuves tiesības uz augšupielādes katalogu. Visticamāk, šajā gadījumā funkcija mkdir () Tas nedarbosies, jo mums nav tiesību rakstīt uz Dokumentu direktoriju (parasti / var / www / html vai / home / httpd / html). Reģistrējieties kā sakņu sistēma, izveidojiet augšupielādes direktoriju un mainīt tās īpašnieku un piekļuves tiesības šādi:

    // Izveidot augšupielādes katalogu

    // Uzstādiet Apache īpašnieka un tās grupas nosaukumu - arī Apache:

    Chown Apache: Apache augšupielādes

    // Rakstīt izšķirtspēju ikvienam (777) + uzstādīšana no stiprinājuma bitu (1):

    CHMOD 1777 augšupielādes.

    Faila lielums var būt ierobežots, ja vēlaties, varat rediģēt .htaccess failu un ierobežot piekļuvi augšupielādes direktorijā - norādiet vai konkrētus lietotājus, kuri var piekļūt direktorijai vai IP adresēm.

    Tagad jūs varat augšupielādēt failus serverī.

    Mēs rakstām PHP skriptu lejupielādes failus serverī


    // Katalogs, kurā mēs saņemsim failu:
    $ Uploaddir \u003d "./files/";
    $ UploadFile \u003d $ Uploaddir. Basename ($ _files ["Uploadfile"] ["Vārds"]);

    // Kopēt failu no direktorijas pagaidu failu glabāšanai:
    ja (kopēt ($ _files ["UploadFile") ["TMP_NAME"], $ UploadFile))
    {
    atbalss. "

    Fails tiek veiksmīgi lejupielādēts serverī.

    " ;
    }
    cits (atbalss) "

    Kļūda! Neizdevās lejupielādēt failu serverī!

    "
    ; Izeja; )

    // Parādīt informāciju par lejupielādēto failu:
    atbalss. "

    Informācija par servera ielādes failu:

    "
    ;
    atbalss. "

    Lejupielādētā faila sākotnējais nosaukums: ". $ _Files ["UploadFile"] ["Vārds"]. "

    " ;
    atbalss. "

    Mime veida lejupielādēto failu: ". $ _Files ["UploadFile"] ["Tips"]. "

    " ;
    atbalss. "

    Iekrautā faila lielums baitos: ". $ _Files ["Izmērs"] ["Size"]. "

    " ;
    atbalss. "

    Pagaidu faila nosaukums: ". $ _Files ["UploadFile"] ["TMP_NAME"]. "

    " ;

    ?>

    Vairāku failu ielādi var īstenot, izmantojot, piemēram, ievades tagu dažādas nosaukuma vērtības.

    Tas arī paredz iespēju automātiski iegūt informāciju, kas organizēta vairāku vienlaicīgu lejupielādējamu failu klāstā. Lai īstenotu šādu iespēju, izmantojiet to pašu datu sintaksi no HTML formas kā vairākiem atlases un rūtiņu laukiem:


    Nosūtīt šos failus:






    Ja šāda veidlapa ir nosūtīta, masīvi $ _files ["userfile"], $ _files ["userfile"] ["Vārds"] un $ _Files ["Userfile"] ["Izmērs"] tiks inicializēts ( Tādā pašā veidā, piemēram, $ http_post_files PHP 4.1.0 un agrāk versijas). Ja Register_globals konfigurācijas direktīva ir noteikta pēc vērtības, saistītie globālie mainīgie tiks inicializēti. Katrs no šiem mainīgajiem lielumiem būs skaitliski indeksēta masīva atbilstošo vērtību saņemtajiem failiem.

    Pieņemsim, ka /home/test/some.html un /home/test/file.bin faili tika lejupielādēti. Šādā gadījumā $ _files ["userfile"] ["Vārds"] mainīgajam būs zināms.html vērtība, un $ _files ["Userfile"] mainīgais ["vārds"] ir fails.Bin. Tāpat mainīgais $ _files ["userfile"] ["Size"] satur faila izmēru .html un tā tālāk.

    Mainīgie $ _files ["userfile"] ["Vārds"], $ _Files ["userfile"] ["tmp_name"], $ _Files ["userfile"] ["" \u200b\u200bizmērs "] un $ _files [" Userfile "] [" tips "] tiks inicializēts arī.

    Secinājums:

    Kā redzat, nav tik grūti organizēt failu lejupielādes serveri. Tas ir grūtāk nodrošināt nepieciešamo drošības līmeni, jo iekraušanas failus uz serveri var izmantot, uzbrucēji uz serveri. Kā nodrošināt nepieciešamo drošības līmeni, strādājot ar augšupielādēm, skatiet.



    <<< Назад Saturs Uz priekšu \u003e\u003e\u003e
    Joprojām ir jautājumi vai kaut kas nesaprotams - laipni gaidīti mūsu