Cерверге файлды жүктеу (1-бөлім)

бұл постта мен серверге файлды жүктеу жайында бірдеңелер жазғалы жатырмын. сонымен тағырыбым «серверге файлды жүктеу, және оның қауіпсіздігін қамтамасыз ету» (суперқауіпсіз қылып емес әрине, бірақ өзім білетін жолдарын жазатын боламын). Бұл үлкен, әрі күрделі тақырып болғандықтан, мен бірнеше бөлімге бөліп жариялайтын боламын.

Анықтама:

Серверге файлды жүктеу дегеніміз не?
почта сервистері арқылы жазылған хатқа іліп жіберген құжатыңыз болсын, мои мирге салған суретіңіз болсын, ютубқа салған видео болсын осылардың барлығында серверге файлды жүктеу амалы қолданылады. яғни сіз өз компьютеріңізден интернеттегі серверге файлды жүктеп жатырсыз. міне бар болғаны осы.

Форма дегеніміз не? (form).

form тегі веб құжаттың бетіне қолданушы мен сервер ақпарат алмасу үшін қойылатын тег. form тегі өз бетімен серверге құжатты не басқа ақпаратты жібергенімен, ары қарата сол ақпаратты өңдеу, орналастыру, шығару қызметі скрипттардың көмегімен жүзеге асырылады.

Көп сөзді қойып бірден тәжірибеге көшейін. (Тәжірибе емес, бәрібір анықтама болып кетті)

Серверге файлды жүктеу multipart-формасы арқылы жүзеге асырылады. Формада кем дегенме міндетті түрде файл жүктейтін поля мен серверге формадағы ақпаратты жіберетін submit батырмасы болуы керек. Егер форма файл жіберуге арналған болса онда enctype атрибутының мәнін multipart/form-data деп аламыз.

алдымен веб құжатты құрып, оны php кеңейтілімінде, index.php деген атпен сақтаймыз, және сол құжаттың қасына files папкасын да құрып қоямыз (артынан керек болады)

HTML-да былай жазамыз body дың ішіне
<form action="#" method="post" enctype="multipart/form-data">
   <input type="file" name="file_1">
   <input type="submit" value="Жүктеу">
</form>


жеке жеке түсіндіретін болсам

form — тегі жалпы веб беттегі серверге ақпарат жіберуге және inputтарды топтастырып, жіберілетін ақпараттың параметрі көрсетуге арналған деп айтсам да келісетін сияқты.
  • action — форматың атрибуты, бұл жерде жіберілген ақпарат қай жерде өңделетіні жазылады, # деп қойған себебім мен қарастырып отырған мысалда, ақпаратты сол беттегі скрипт өңдейді дегенді білдіреді, егер скрипт басқа жерде орналасқан болса онда сол скриптқа апарар жолын жазасыз, сілтейсіз
  • method — серверге жіберілетін ақпарат қай методпен жіберілетіні жазылады. Бұл атрибуттың екі мәні бар, біріншісі GET екіншісі POST
    • GET — бұл методтта ақпарат URL адресі арқылы жіберіледі. кішігіріп ақпаратты жіберуге тиімді, және кеңінен қолданылады. Бірақ бұл методпен ақпаратты жіберу қауіпсіз емес, және бұл методпен көп көлемдегі ақпаратты жібере алмайсыз
    • POST — серверге құжатты жіберу кезінде көбіне осы метод пайдаланылады. Бұл методтта ақпарат ашық күйінде жіберілмейді. Және қауіпсіз болып саналады
  • enctype — бұл атрибутта жіберілетін ақпараттың кодтталу (кодирование) типі көрсетіледі. файл жіберу формасы үшін әрқашанда multipart/form-data мәні жазылады

input — әртүрлі интерактивті формаларды жасауға арналған маңызды тег. Типіне қарай өзгеріп отырады. Бұл тегтің шамамен жиырмашақты типі бар. Оның бәрін жазбай ақ қояйын, тек біздің мысалда көрсетілген екі типті айтып кетейін.
  • type=«file» — серверге жіберілетін құжатты таңдауға арналған тип.
    • name=«file_1» — серверге жіберілетін құжатты айнымалысының аты (керек болады бізге, міндетті түрде жазылуы керек)
  • type=«submit» — басқа input тегтердегі енгізілген ақпаратты серверге жіберуге арналған тип. яғни формада submit типтес input болмаса онда сіздің енгізілген ақпаратыңыз ешқайда жіберілмейді (клиенттік скритпен жіберуге болады, бірақ ол басқа тақырып)
    • value=«Жүктеу» — Батырманың мәні, яғни мәтіні

Осы кодттың браузердегі көрінісі былай, әр браузер бұл форманы әр түрлі көрсетеді, бірақ шамамен былай болуы керек (хромда)


Енді бізде форма бар, файлды таңдай аламыз, және таңдаған файлымызды серверге жіберетін батырмамыз бар. Ары қарата іске PHP кіріседі.

PHP неге кіріседі? Ол не істейді?

multipart форманың ақпараттары серверге келгеннен жедел түрде PHP құжатты сервердің уақытша папкасына .tmp кеңейтілімімен, және кездейсоқ атпен жүктеп қояды.
Сосын онымен қоймай ол төрт (немесе бес) айнымалыдан тұратын СУПЕРГЛОБАЛДЫ $_FILES МАССИВІН құрады. Бұл массивте жүктелген құжат жайында ақпараттар орналасқан.


Массивтердің айнымалыларына жеке жеке тоқталайық
Назар аударсаңыздар, бұл массивтің аты манағы біз жазып кеткен name=«file_1» атын қолданады.

$_FILES['file_1']['name'] — бұл массивтің айнымалысында таңдалған файлдың аты сақталады, мысалы сіз өз компьютеріңізден aitaber.jpg файлын таңдасаңыз, сол файлдың есімін PHP осы жерде сақтап қояды;
$_FILES['file_1']['size'] — жаңағы құжаттың көлемі жазылады (байтпен өлшенеді);
$_FILES['file_1']['type'] — таңдалған файлдың MIME-типі сақталады (барлық құжаттың типі анықталмайды), мысалы aitaber.jpg файлын таңдасаңыз оның типі: image/jpeg деп анықталады;
$_FILES['file_1']['tmp_name'] — бұл жерде уақытша папкадағы құжаттың аты жазылады (естеріңде болса, мана PHP құжатты уақытша папкаға жүктеп, оған кездейсоқ ат беріп, .tmp кеңейтілімімен сақтап қойған еді);
$_FILES['file_1']['error'] — Егер файлды жүктеу кезінде қателіктер шығып қалған болсағ сол қателіктер осы айнымалыда жазылады

Енді ең қызығы PHP дің файлды жүктеу алгоритмі!

Алгоритм: Файл таңдалып, submit батырмасы басылғаннан кейін скрипт жүріп бастайды, $_FILES массивіне керекті ақпараттың барлығын жүктеп алғаннан кейін, ол барады да уақытша папкаға құжатты көшіреді, скрипт біткесін уақытша папкадағы құжатты өшіріп тастайды =) иә иә өшіріп тастайды. біз сол скрипттің ортасында массивтегі ақпаратты пайдалана отырып, уақытша папкадағы файлды бір жерге көшіріп үлгеруіміз керек, яғни қысқаша айтқанда былай болады.

$_FILES['file_1']['tmp_name'] дағы ақпараттан уақытша папкадағы файлдың атын біліп аламызда files папкасына $_FILES['file_1']['name'] деген атпен көшіріп аламыз (көшіріп алатын папкамыздың атын files деп алдық, есіңде болса мана сол папканы құрған болатынбыз мақаланың басында).
Көшіру copy() функциясы арқылы жүзеге асырылады

Сонымен PHP код

if ($_FILES['file_1']) //егер $_FILES['file_1'] бар болса (яғни егер файл жүктелсе)
{
copy($_FILES['file_1']['tmp_name'], "files/".$_FILES['file_1']['name']);
}


толық исходный коды (код толықтай жасап тұр, қолданып көрулеріңізге болады (алдымен files папкасын құрып алуды ұмытып кетпеңіз)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Серверге файлды жүктеу</title>
</head>
<body>
<?
if ($_FILES['file_1'])
{
copy($_FILES['file_1']['tmp_name'], "files/".$_FILES['file_1']['name']);
}
?>
<form action="#" method="post" enctype="multipart/form-data">
   <input type="file" name="file_1">
   <input type="submit" value="Жүктеу">
</form>
</body>
</html>


Міне кішігірім код арқылы біз серверге файлды жүктеп, оны уақытша папкадап, өз папкамызқа көшіріп алдық, қиын емес қой ә? Бірақ қуанбай тұра тұрыңыз, ҚАУІПСІЗДІК деген тағы бар ғой, мысалы қолданушы серверге қай бір жөні түзу файлды жүктейді дейсің, ол вирус жүктеуі мүмкін, не басқа бір қауіпті ақпараттарды жүктеуі мүмкін. сондықтан жүктелген файлдың типін, түрін, көлемін барлығын барлығын тексеру керек. бірақ оны келесі тақырыпта жалғастырамын, әйтпесе мынау тым ұзақ болып кеткен сияқты

15 пікір

Korkem
Тамаша пост! тамаша пост! тамаша пост! тамаша пост! тамаша! тамаша!!!)))) +1
Abylai
жариялағаныма бір минут та болған жоқ қой )) оқып болдың ба уже? ))
Korkem
Сен де менікін дем де оқып қоясың ғой..)))
Abylai
әә солай екен ау ә )))
Azamat
Осындай пайдалы посттар көп болса екен!
mairosh
Осындай бытықы сытықыларды түсінбеймін. Бірақ ерінбей оқым шықтым ау))
qwenchi
if ($_FILES['file_1'])
емес

if (!$_FILES['file_1']['error'])

деп тексерген дұрыстау болатын шығар
Abylai
ия ол дұрыс. мында мен тек ең қарапайым түрімен көрсеткен болатынмын. осы посттың екінші бөлімі жазылып жатыр, сол жерде толық жазамын.
ereke_enu
О о мынау базар жоқ! Байқамай қалыппын) Айып етпең, бро!
Abylai
жалғасын жазамын деп жүргеніме жарты жыл болыпты
khairbek
маган түсіндіріндер па падробния тихнишны өздерін уйреніп жатсывндарго наттури! неден бастайм кай сайттан, қай кітаптан, кай стадиядан деген сиякты ангмелерго
Abylai
ок! html, css, php жаңадан үйренушілерге арнап пост жазып көрейін
khairbek
осы саланы уйренгім келед Англиски шамалы білем тағы қандай спасобнысты керек???????????????
Тек тіркелген қолданушылар ғана пікір қалдыра алады.