КампутарыТыпы файлаў

PHP: загрузка файла на сервер

Загрузка файлаў праз PHP - вельмі цікавая справа, да якога трэба падыходзіць вельмі ўважліва. У інтэрнэце можна знайсці мноства прыкладаў рэалізацыі загрузкі файлаў, але не ўсе яны добрыя і адказваюць правілах бяспекі.

Падобныя рэчы трэба даводзіць да канца, нават калі на гэта пойдзе шмат часу. Калі вы пакінеце пралом у кодзе, то ўвесь ваш сервер можа апынуцца пад пагрозай.

бяспеку

Пры дапамозе PHP загрузка файлаў на сервер ажыццяўляецца досыць лёгка. Код вельмі кароткі і просты. Ўсяго толькі пара радкоў. Але такі метад небяспечны. Куды больш часу і радкоў кода сыходзіць на бяспеку.

Небяспека заключаецца ў тым, што, калі не рабіць праверак, любы зламыснік зможа загрузіць свае скрыпты на ваш сервер. Пры гэтым у яго будзе поўны доступ. Ён зможа зрабіць усё, што захоча:

  • выдаліць базы;
  • выдаліць файлы сайтаў;
  • змяніць файлы сайтаў;
  • дадаць сваю рэкламу на ваш сайт;
  • загрузіць вірусы;
  • перанакіроўваць ўсіх карыстальнікаў на свае сайты;
  • і многае іншае, што прыйдзе ў галаву ўзломшчыку.

Заўсёды трэба правяраць, што за файл спрабуе загрузіць карыстальнік. Калі, напрыклад, вы загружаеце толькі фатаграфіі, неабходна праверыць, што гэты файл дакладна з'яўляецца малюнкам. У адваротным выпадку да вас загрузяць што заўгодна.

Як менавіта рэалізаваць праверку, будзе паказана далей, пры непасрэдным разглядзе скрыпту загрузкі файлаў.

Стварэнне формы PHP

Форма загрузкі файла выглядае вельмі проста. Хапае кнопкі агляду і кнопкі загрузкі.

Апісваць стварэнне формы не будзем, бо гэта лёгка. Далейшыя інструкцыі мяркуюць, што ў вас ужо ёсць базавыя паняцці HTML (інакш бы вы не шукалі інфармацыю аб загрузцы на PHP).

Але зьвярніце ўвагу, што для перадачы дадзеных у форме трэба дадаць атрыбут enctype.

Інакш дадзеныя аб файле апрацоўшчык перадавацца не будуць.

Як гэта павінна працаваць?

Пры націску на кнопку агляду ў вас павінна адкрыцца акенца, дзе прапануюць выбраць файл.

Пасля гэтага павінен будзе з'явіцца шлях, дзе размешчаны файл.

Калі шлях не з'явіцца, то прарабіце гэта дзеянне яшчэ раз.

Пасля націску на кнопку загрузкі файлам-апрацоўшчыкам можна выдаць любую інфармацыю.

Напрыклад, можна напісаць радок, у якой гаворыцца, што файл з "такім-то" назвай быў паспяхова загружаны ў "такую-то" тэчку. Зразумела, імя файла будзе выдавацца заўсёды рознае.

Звычайна такую падрабязную інфармацыю выкарыстоўваюць для адладкі кода. Такім чынам можна праверыць, што дадзеныя перадаюцца і запіс адбываецца ў патрэбную вам дырэкторыю. Гэта значыць, нават імя файла не паказваюць. Паколькі гэта лішняя інфармацыя, якая карыстачу не патрэбна.

Мае сэнс выснову дадзеных пра імя толькі ў тым выпадку, калі карыстач загружае некалькі файлаў. Такі выпадак разгледзім крыху далей. Не будзем забягаць наперад.

Настройка

У PHP загрузка файла на сервер патрабуе пэўных налад, якія трэба рабіць у файле php.ini. У гэтым файле вельмі шмат налад. Яны ўсе нам не патрэбныя. Нас цікавяць тры радкі: file_uploads, upload_tmp_dir і upload_max_filesize.

Звярніце ўвагу на тое, што гэтыя налады закрануць ўсіх вашых сайтаў на серверы, а не толькі нейкага аднаго. Таму задавайце максімальны памер зыходзячы з таго, што ў вас будуць загружаць карыстальнікі. Не рэкамендуецца задаваць занадта вялікія значэння.

Пасля таго, як вы змянілі значэння ў гэтых параметрах, сервер трэба перазагружаць. Інакш налады не ўступяць у сілу, так як яны счытваюцца ў момант загрузкі сервера.

Зрабіць гэта можна ў кансолі, падключыўшыся праз SSH да сервера. Дастаткова ўвесці каманду service httpd restart, і пасля гэтага налады набудуць моц.

Іншы спосаб - перазапуск праз ISP-панэль або праз білінг-панэль правайдэра.

Масіў з файлам

У PHP загрузка файла адбываецца пры дапамозе масіва $ _FILES. У ім змяшчаецца ўся інфармацыя аб файлах, якія мы будзем загружаць.

Для таго каб паглядзець, якая менавіта інфармацыя змяшчаецца ў гэтым масіве, дастаткова напісаць у файле-апрацоўшчыку наступнае.

Абярыце любы файл і націсніце "Загрузіць". На старонцы апрацоўшчыка вывядзецца інфармацыя, якая захоўваецца ў $ _FILES. Пераменная пішацца цалкам з вялікімі літарамі. PHP - мова рэгістру.

Як бачыце, у гэтым масіве ёсць шмат палёў. Усе яны для нас важныя. У першым полі захоўваецца назву файла ў тым выглядзе, у якім яно выкарыстоўваецца на вашым кампутары.

У графе type паказаны тып файла. Полі tmp_name адпавядае імя часовага файла. Пасля заканчэння працы скрыпту ён будзе выдалены.

У поле error захоўваецца код памылкі. Пра гэта трохі далей. Size - памер у байтах.

памылкі

Якая ажыццяўляецца праз PHP загрузка файла заўсёды суправаджаецца кодам памылкі. Паведамленне пра памылку складзена ў полі "error". На скрыншоце памылка роўная нулю.

Разгледзім значэнні ўсіх памылак:

Вышэй было сказана пра параметр, які можна паказаць у звычайным HTML.

Вось прыклад формы для загрузкі файла, дзе паказана абмежаванне ў памеры загружанага файла.

PHP: скрыпт загрузкі файла

Як жа ўсё ажыццяўляецца на практыцы? У PHP загрузка файла адбываецца камандай copy. Калі вас цікавіла пытанне пра тое, як загрузіць файл, то адказам будзе проста copy, у якой выкарыстоўваецца два параметру - зыходны файл і файл прызначэння.

Але, як пісалася вышэй, абмяжоўвацца гэтым нельга ў мэтах бяспекі. Напрыклад, праверыць што за файл мы грузім, можна пры дапамозе поля type ў масіве $ _FILES. Спачатку разбярэмся з праверкай, а потым пяройдзем да паўнавартаснага скрыпту

Дапусцім, вы хочаце, каб карыстальнікі маглі загрузіць фатаграфію з дазволам толькі GIF, JPEG ці PNG. Пазначыць гэта можна вось так.

if ($ _ FILES [ 'file_upload'] [ 'type']! = "image / gif") {
echo "Выбачайце, мы падтрымліваем загрузку толькі Gif-файлаў";
exit;
}

Калі хочаце грузіць усе 3 тыпу, то проста дадайце дадатковае ўмова з іншым тыпам малюнка.

Капіяванне робіцца вось так: copy (файл 1, файл 2).

У нашым выпадку, калі праца ідзе з загрузкай з кампутара на сервер, можна рабіць так

copy ($ _ FILES [ 'file_upload'] [ "tmp_name"], "1.jpg")

Гэта значыць файл будзе капіявацца з назвай 1.jpg. Гэта не зусім правільна. У дадзеным выпадку гэта толькі прыклад. Імя файла заўсёды трэба задаваць рознае, і пашырэнне паказваць у залежнасці ад файла.

Вызначыць пашырэнне можна рознымі спосабамі. Усё залежыць ад эрудыцыі распрацоўніка. Адзін з самых хуткіх спосабаў (розніца ў дзесятых долях секундах) вызначэння пашырэння - гэта наступны код.

$ Path_info = pathinfo ($ _ FILES [ 'photo1'] [ "name"]);

$ Ext = $ path_info [ 'extension'];

У зменнай $ ext ў нас будзе захоўвацца шуканае пашырэнне. А імя файла можна задаць выпадковым чынам пры дапамозе md5. Калі вы плануеце загружаць шмат файлаў, то лепш грузіць іх у розныя тэчкі. Так будзе зручней. Асабліва калі захочаце правесці чыстку.

Код для загрузкі будзе наступным.

/// наяўнасць фота

if ($ _FILES [ 'photo1'] [ 'tmp_name'] == null)

{

echo ( "

Файл не пазначаны.

Назад ... ");

exit;

}

///. Дапусцім, у вас для якога-небудзь праекта на сэрвэры дазволена грузіць вялікія файлы (відэа), але тут будуць толькі фатаграфіі, і карыстальнікаў трэба абмежаваць

if (($ _FILES [ "photo1"] [ "size"]> 1024 * 1024 * 2)

{

?>

Максімальна дазволены памер выявы 2 Мб

Назад ...

exit;

}

// стварэнне тэчак

// стварэнне тэчкі бягучага месяца

if (! file_exists ( "img /". date ( "M")))

{

mkdir ( "img /". date ( "M"));

}

// стварэнне тэчкі бягучага дня

if (! file_exists ( "img /". date ( "M"). "/". date ( "d")))

{

mkdir ( "img /". date ( "M"). "/". date ( "d"));

}

/// пашырэнне файла

$ Path_info = pathinfo ($ _ FILES [ 'photo1'] [ "name"]);

$ Ext = $ path_info [ 'extension'];

/// генеруючы імя файла

$ Id = md5 (date ( "YMd"));

if (copy ($ _ FILES [ 'photo1'] [ "tmp_name"], "img /". date ( "M"). "/". date ( "d"). "/". $ id. $ ext) )

{

echo ( "файл паспяхова загружаны");

}

/// любыя далейшыя дзеянні (запіс у базу і т. П.)

}

некалькі файлаў

Загрузка некалькіх файлаў (PHP) адбываецца пры дапамозе дадатковых палёў у форме.

Дадзены спосаб не вельмі добры, бо абмяжоўвае колькасць файлаў для загрузкі. Больш за тое, лічыцца дрэнным тонам у праграмаванні. Старайцеся рабіць усё дынамічнае.

Ідэальны варыянт - гэта магчымасць выбару адразу вялікага ліку файлаў націскам на адну кнопку.

Для гэтага форму ствараем вось такім кодам.

Звярніце ўвагу, што дададзена слова multiple, і імя зададзена як масіў []. У гэтым выпадку масіў $ _FILES будзе трохі адрознівацца. У вас атрымаецца масіў у масіве.

Для праверкі можаце зноў скарыстацца var_dump ($ _ FILES);

Усе вашыя файлы будуць размяшчацца ў масіве вось так:

  1. $ _FILES [ "file1"] [ "name"] [0]
  2. $ _FILES [ "file1"] [ "name"] [1]
  3. І гэтак далей.

У дужках пішацца нумар файла ў масіве. Адлік з нуля. Апрацоўваем іх сапраўды гэтак жа, проста задаем цыкл і пры звароце ў вышэй апісаным кодзе ў канцы дадаем індэкс [$ i].

$ I = 0;

while ($ _FILES [ "file1"] [ "name"] [$ i] <> '')

{

/// вставляем вышэйапісаны код

}

Такім чынам, у вас будзе адбывацца праз PHP загрузка файлаў на сервер у адным цыкле без лішняга паўтарэння кода, як гэта звычайна бывае, калі выкарыстоўваць варыянт са статычным колькасцю файлаў (апошняе фота).

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 be.birmiss.com. Theme powered by WordPress.