Çàãðóçêà ôàéëîâ
Àâòîð: | Àðòåìüåâ Ñåðãåé Èãîðåâè÷ |
ICQ: | 438856621 |
email: | _spin_@bk.ru |
Ïðàêòè÷åñêè â êàæäîì ïðîåêòå ðàçðàáîò÷èê ñòàëêèâàåòñÿ ñ íåîáõîäèìîñòüþ çàãðóçêè ôàéëîâ íà ñåðâåð. Ôîòîãðàôèè, êàðòèíêè, äîêóìåíòû, àðõèâû è ìíîãîå äðóãîå ìîæåò áûòü çàãðóæåíî íà ñåðâåð ïîñðåäñòâîì web-èíòåðôåéñà (÷åðåç áðàóçåð).
Çàãðóçêà äàííûõ íà ñåðâåð ìîæåò ïðîèñõîäèòü îäíèì èç äâóõ ìåòîäîâ: GET èëè POST. Ìåòîä GET ïîäðàçóìåâàåò, ÷òî âñå ïàðàìåòðû ïåðåäàþòñÿ â ñòðîêå URL. Íàïðèìåð, ñòðîêà:
http://localhost/index.php?name=myname&page=10
îïðåäåëÿåò çàïðîñ GET ê ñòðàíèöå index.php. Ïðè ýòîì ñêðèïòó ïåðåäàþòñÿ ïàðàìåòðû "name" è "page" ñî çíà÷åíèÿìè "myname" è "10" ñîîòâåòñòâåííî. Êàê âèäèòå, çàïðîñ ñîñòîèò èç ïàð "èìÿ=çíà÷åíèå", îáúåäèí¸ííûõ ÷åðåç "&". Çàïðîñ îòäåëÿåòñÿ îò àäðåñà ñòðàíèöû çíàêîì âîïðîñà "?".
Íî GET íå ïîäõîäèò äëÿ ïåðåäà÷è áîëüøèõ äàííûõ. Äëÿ ýòîãî ñóùåñòâóåò ìåòîä POST. Ýòîò ìåòîä ïåðåäà¸ò äàííûå ñêðûòî îò ïîëüçîâàòåëÿ, à àäðåñ ñòðàíèöû îñòà¸òñÿ íåèçìåííûì. Òåîðåòè÷åñêè, ìåòîä POST ïîçâîëÿåò ïåðåäàâàòü îãðîìíûå áëîêè äàííûõ, íî áîëüøèíñòâî ïðîâàéäåðîâ óñòàíàâëèâàþò æåñòêîå îãðàíè÷åíèå â 5-10 ìåãàáàéò.
Äëÿ ðåàëèçàöèè çàãðóçêè ôàéëà íåîáõîäèìî ñíàáäèòü ïîëüçîâàòåëÿ ñîîòâåòñòâóþùåé ôîðìîé. Äëÿ çàãðóçêè ôàéëîâ ïðåäíàçíà÷åí òåã input òèïà file.
<form action="receiver.php" method="post" enctype="multipart/form-data"> Âûáåðèòå ôàéë äëÿ çàãðóçêè: <input type="file" name="ufile" /><br /> <input type="submit" name="send" value="Îòïðàâèòü!" /> </form>
Ïîëüçîâàòåëü âûáèðàåò íóæíûé ôàéë, íàæèìàåò êíîïêó "Îòïðàâèòü!", ïîñëå ÷åãî áðàóçåð ïåðåäà¸ò óêàçàííûé ôàéë íà ñåðâåð. Ïî îêîí÷àíèè çàãðóçêè ôàéëà çàïóñêàåòñÿ receiver.php, è åìó àâòîìàòè÷åñêè ñòàíîâÿòñÿ äîñòóïíû âñå ïåðåäàííûå â ôîðìå äàííûå.
Ñïèñîê çàãðóæåííûõ ôàéëîâ õðàíèòñÿ â ãëîáàëüíîì ìàññèâå $_FILES. Ýòî àññîöèàòèâíûé ìàññèâ, ãäå êàæäûé ýëåìåíò ñîäåðæèò îïèñàíèå îäíîãî èç ôàéëîâ. Ðàññìîòðèì íà ïðèìåðå:
<?php // èíèöèàëèçèðóåì íóæíûå ïåðåìåííûå $filename = ''; $filepath = ''; $filetype = ''; // ïðîâåðÿåì, ÷òî ôàéë çàãðóæàëñÿ if(isset($_FILES['ufile']) && $_FILES['ufile']['error'] != 4) { // ïðîâåðÿåì, ÷òî ôàéë çàãðóçèëñÿ áåç îøèáîê if($_FILES['ufile']['error'] != 1 && $_FILES['ufile']['error'] != 0) { $error = $_FILES['ufile']['error']; $errors []= 'Îøèáêà: Ôàéë íå çàãðóæåí.'. ' Êîä îøèáêè: ' . $error; } else { // ôàéë çàãðóæåí íà ñåðâåð // ïðîâåðÿåì ôàéë íà ìàêñèìàëüíûé ðàçìåð $filesize = $_FILES['ufile']['size']; if($_FILES['ufile']['error'] == 1 || $filesize > 3145728) { $filesize = ($filesize != 0)? sprintf('(%.2f Ìá)' , $filesize / 1024): ''; die('Îøèáêà: Ðàçìåð ïðèêðåïë¸ííîãî ôàéëà '. $filesize.' áîëüøå äîïóñòèìîãî (3 Ìá).'); } else { $filename = $_FILES['file']['name']; $filepath = $_FILES['file']['tmp_name']; $filetype = $_FILES['file']['type']; if($this->filetype == null || $this->filetype == '') $this->filetype = 'unknown/unknown'; } } } echo 'Óñïåøíî çàãðóæåí ôàéë: ' . $filename; ?>
Âñå çàãðóæåííûå ôàéëû ñîõðàíÿþòñÿ ñåðâåðîì âî âðåìåííîì êàòàëîãå è àâòîìàòè÷åñêè óäàëÿþòñÿ ïîñëå çàâåðøåíèÿ ñêðèïòà. Åñëè âàì íåîáõîäèìî ñîõðàíèòü ôàéë íà ñåðâåðå - åãî íàäî ïåðåìåñòèòü â îäèí èç êàòàëîãîâ ñàéòà. Äëÿ ýòîãî ñëóæèò ñïåöèàëüíàÿ ôóíêöèÿ move_uploaded_file(). Îá÷íî îíà èñïîëüçóåòñÿ â ïàðå ñ ôóíêöèåé is_uploaded_file(), êîòîðàÿ ïîçâîëÿåò îïðåäåëèòü, áûë ëè ôàéë çàãðóæåí ÷åðåç ôîðìó. Íàïðèìåð:
<?php // $filename - èìÿ çàãðóæåíîãî ôàéëà if(is_uploaded_file($filename)) move_uploaded_file($filename, 'files/' . basename($filename)); // ôàéë áóäåò ïåðåìåù¸í â êàòàëîã files/ ?>
Èíôîðìàöèÿ î êàæäîì çàãðóæåííîì ôàéëå ïðåäñòàâëÿåòñÿ â ñêðèïòå êàê ýëåìåíû ìàññèâà $_FILES. Èìÿ ýëåìåíòà îïðåäåëÿåòñÿ àòðèáóòîì name òåãà ôîðìû.  íàøåì ñëó÷àå àòðèáóò name ðàâåí "ufile", çíà÷èò äàííûå îá ýòîì ôàéëå áóäóò õðàíèòüñÿ â ýëåìåíòå $_FILES['ufile'].
Êàæäûé ýëåìåíò $_FILES òàê æå ÿâëÿåòñÿ ìàññèâîì, ñîäåðæàùèì ïÿòü ýëåìåíòîâ ñ ôèêñèðîâàííûìè èìåíàìè:
$_FILES['ufile']['name'] | Ñîäåðæèò èñõîäíîå èìÿ ôàéëà, êàêèì îíî áûëî íà êîìïüþòåðå ïîëüçîâàòåëÿ. |
$_FILES['ufile']['type'] | Ñîäåðæèò MIME-òèï ôàéëà. Íàïðèìåð, äëÿ jpeg-èçîáðàæåíèÿ áóäåò ñîäåðæàòü "image/jpeg". |
$_FILES['ufile']['size'] | Ñîäåðæèò èñòèííûé ðàçìåð ïåðåäàííîãî ôàéëà â áàéòàõ. |
$_FILES['ufile']['tmp_name'] | Ñîäåðæèò ïîëíûé ïóòü ñ çàãðóæåííîìó íà ñåðâåð ôàéëó. Åñëè âàì íå íóæíî õðàíèòü çàãðóæåííûé ôàéë íà ñåðâåðå - ìîæíî ïîëüçîâàòüñÿ ýòèì ïàðàìåòðîì äëÿ îáðàùåíèÿ ê ôàéëó. |
$_FILES['ufile']['error'] | Ñîäåðæèò êîä îøèáêè, åñëè òàêîâàÿ èìåëà ìåñòî. Åñëè îøèáîê íåò - ñîäåðæèò 0. |
Ðàçìåð çàãðóæàåìûõ ôàéëîâ ìîæåò çíà÷èòåëüíî ìåíÿòüñÿ îò ïðîâàéäåðà ê ïðîâàéäåðó. Íåêîòîðûå àäìèíèñòðàòîðû âîîáùå çàïðåùàþò çàãðóçêó ôàéëîâ.  ýòîì ñëó÷àå ôàéë âñ¸ ðàâíî ìîæåò çàãðóçèòüñÿ, ñåðâåð åãî óäàëèò, à ñêðèïòó ñîîáùèò, ÷òî ôàéë áûë, íî óæå óäàë¸í.