СЦЕНАРІЙ ОБРОБКИ

Тепер не менш важлива частина - сценарій обробки завантаженого файлу.
На сторінці, ім'я якої вказане в параметрі action заголовка форми завантаження файлу, в будь-якому її місці слід помістити такий код:

<?php

Якщо в полі введення імені файлу нічого не було, то виконання сценарію припиняємо (з виведенням повідомлення користувача - наприклад, як на мал. 7.4), якщо ж немає - те виконується наступна за даною умовою команда elseif:

if ($zak=="none")
{echo ("Ви забули вказати файл...");}

Ріс.7.4. Повідомлення користувача в разі невказівки імені файлу

Примітка:
Команда elseif використовується в операторові if для того, щоб проводити перевірку якої-небудь умови у тому випадку, коли та умова, яка вказана в заголовку оператора if, невірно. Вона ідентична конструкції:
}
else
{
if (вираження) {
} }
і введена в РНР для спрощення синтаксису програм.

Якщо введений користувачем пароль не відповідає тому, що вказаний в даному сценарії (звернете увагу, що правильний пароль для завантаження файлів вказується саме тут!), то виконання сценарію припиняємо (з виведенням повідомлення користувача - як на мал. 7.5), якщо ж немає - те виконується наступна за даною умовою команда elseif.

Мал. 7.5. Повідомлення користувача в разі неправильного введення пароля

Якщо ви бажаєте призначити різним користувачам окремі паролі (щоб, скажімо, мати можливість заборонити завантажувати файли лише одному з них, не торкнувшись інтересів останніх), то просто вкажіть тут відповідну умову (може виглядати так: "elseif ( ($pass!="paroll")&&($pass! = "parol2") )"):

elseif ($pass!="parol")
{ echo ("Ваш пароль невірний!");}

І нарешті, само копіювання - допустимий, в теку user. Після його закінчення користувачеві видається відповідне повідомлення (мал. 7.6).

Мал. 7.6. Повідомлення користувача в разі успішного завантаження

У умові elseif в нижченаведеній строчці перевіряється, чи видає команда сміттю значення True - що повинне відбуватися при успішному копіюванні. (Якщо не можете розібратися в синтаксисі -смотріте Опис РНР.)

elseif (сміттю($zak, "user/$zak_name"))
{echo("Файл $zak_name розміром $zak_size байт успішно завантажений на сайт.");}

Примітка:
Команда сміттю виконує копіювання файлу з того місця, яке вказане в її першому параметрі, на те, яке вказане в другому. За наявності в місці призначення файлу з тим же ім'ям, що і в копійованого, новий файл пишеться поверх старого. Команда повертає True, якщо копіювання проходіт вдало, і False, якщо немає, виводячи в останньому випадку також повідомлення на ту сторінку, в сценарії на якій вона розташована. (Якщо останнє небажано, то заблокуйте виведення повідомлень про помилку, поставивши перед командою знак @.)

В тому випадку, якщо з якоїсь причини копіювання здійснити не удається, то про це видається повідомлення. В принципі це і необов'язково - невдача копіювання є помилкою РНР, і про це інформація все одно виводиться (ріс.7.7), проте все ж варто ясно вказати користувачеві, через що виникла проблема. До того ж не всі зможуть зрозуміти фразу про помилку англійською мовою.

else
{ echo("He удалося скопіювати $zak_name");}
Кінець скрипта:
?>

Ріс.7.7. Повідомлення користувача в разі помилки копіювання

Ось, власне, і все. Користувач, зайшовши на першу сторінку (ріс.7.3), повинен ввести свій пароль і знайти за допомогою того, що відкривається при натисненні на кнопку "Огляд" діалогового вікна файл для завантаження. Після натиснення кнопки "Завантажити" він побачить одне з трьох повідомлень - див. мал. 7.4, 7.5, 7.6.
Якщо замість імен, що містять інформацію про завантажуваний файл і передаваних через форму змінних, використовувати імена відповідних елементів масивів $HTTP_POST_FILES і $HTTP_POST_VARS, то код обробника виглядатиме так:

<?php
if ($HTTP_POST_FILES['zak']['name']=="none") {echo ("Ви забули вказати файл...");}
elseif ($HTTP_POST_VARS['pass']!="parol") { echo ("Ваш пароль невірний!");}
elseif
(сміттю($HTTP_POST_FILES['zak']['tmp_name'], "user/".$HTTP_POST_FILES['zak']['name']))
{echo ("Файл ".$HTTP_POST_FILES['zak1] ['name'] ." розміром ".$HTTP_POST_FILES['zak']['size']." байт успішно завантажений на сайт.");}
else
echo("Hfe удалося скопіювати ".
$HTTP_POST_FILES['zak']['name']);} ?>

Звернете увагу, що при формуванні кінцевого імені файлу (у команді сміттю), а також в рядках, що виводяться командою echo, писати просто імена елементів масиву не можна - видаватиметься помилка! Необхідно використовувати оператора конкатенації - крапку:
Неправильно:

echo ("Ім'я файлу: $HTTP_POST_FILES['zak']['name']")

Правильно:

echo ("Ім'я файлу:". $HTTP_POST_FILES t'zak'] ['name'])

Можливе завантаження і декількох файлів відразу. Для цього просто у вихідній формі слід вказати декілька полів з типом file, давши кожному своє назву. У обробник будуть передані змінні для кожного завантаженого файлу.
Проте для завантаження декількох файлів можна використовувати і конструкцію з масивом. Для цього досить у вихідній формі дати полям типа file назву з квадратними дужками:

<input name="uploadfile[]" type="file">
<input name="uploadfile[]" type="file">
<input name="uploadfile[]" type="file">

В результаті в програма-обробник будуть передані:

  1. 1. Масиви $uploadfile[], $uploadfile_name[], $uploadfile_size[], $uploadfile_type[], що містять відповідно тимчасові імена завантажених файлів, вихідні імена завантажених файлів, розміри завантажених файлів і типів завантажених файлів. Порядок елементів в масивах в точності відповідає порядку полів у вихідній формі - так, якщо ім'я файлу file.zip було введено в перше поле типа file, то що відносяться до цього файлу змінні розташовуватимуться в елементах перерахованих масивів з індексом 0 (не забувайте - нумерація елементів масивів починається з нуля!).
    Дані масиви будуть передані в обробник у всіх версіях РНР, починаючи з 3.0.1, якщо у файлі php.ini ( Налаштування цього файлу - привілей адміністратора web-сервера, так що якщо ви таким не є, то включити ви її не зумієте) включена опція regis-ter_globals.
  2. 2. Масиви $HTTP_POST_FILES['uploadfile']['tmp_name'][], $HTTP_POST_FILES[luploadfile')['name'][], $HTTP_POST_FILES ['up-loadfile'h'size'][] і $HTTP_POST_FILES['uploadfile']['type'][], що містять відповідно тимчасові імена завантажених файлів, вихідні імена завантажених файлів, розміри завантажених файлів і типів завантажених файлів. Порядок елементів в масивах знову-таки в точності відповідає порядку полів у вихідній формі.
    Дані масиви будуть передані в обробник у всіх версіях РНР, починаючи з 3.0.1, якщо у файлі php.ini включена опція track_vars.
  3. 3. Масиви $_FILES['uploadfile']['name'][], $_FILES['uploadfile'] ['tmpjiame'jo $_FILES['uploadfile']['size'][] u $_FlLES['uploadfile'] I'type'jl]. Їх вміст аналогічно попереднім. Дані масиви будуть передані в обробник у версіях РНР, починаючи з 4.1.

У даних прикладах uploadfde - це всього лише ім'я масиву, ви, природно, можете назвати його по-іншому.
У РНР 3-ої версії з номером підверсії 3.0.17 і вище, а також починаючи з версії 4.0.3, в РНР спеціально для роботи із завантаженими через форму файлами є дві команди - is_uploaded_file іmove_uploaded_file. При використанні описаного вище способу завантаження файлів існує небезпека того, що якийсь зловмисник замість вказівки у формі реального файлу зі свого комп'ютера вкаже дорогу до якого-небудь файлу на web-сервере (наприклад, файлу з паролями користувачів), і тим самим сценарій, оброблювальний завантажений файл, працюватиме вже з цим файлом. Ясна річ, такий розвиток подій представляється вельми небажаним. За допомогою даних команд можна виключити таку можливість. Перша команда перевіряє, чи був той файл, який вказаний в її параметрі, завантажений через форму завантаження файлів з браузера відвідувача, і якщо так, то повертає True, інакше - False. Друга ж аналогічна команді сміттю, проте, в качсстве#ісходного файлу для копіювання в ній допустимо вказувати лише завантажений від відвідувача файл. Інакше команда не відпрацює, повернувши False (без виводу в документ яких-небудь запобігань, на відміну від ситуації невдачі копіювання по яких-небудь іншим причинам).

Примітка:
Команда is_uploaded__file() no суть справи перевіряє, чи знаходиться вказаний в її параметрах файл в тимчасовій директорії сервера - тобто тій, куди всі завантажувані файли спочатку поміщаються. Те ж саме перевіряє іmove_uploaded_file () перед початком копіювання.

Отже, як бачите, надати відвідувачам можливість завантажувати файли на ваш сайт досить просто. Як і створити просту, але досить ефективну систему обмеження цієї можливості по паролю - всього лише за допомогою перевірки передаваною через форму змінної, що містить пароль; сам же пароль вказується в тексті програми на РНР. Для того, щоб дати вашому другу можливість вести свою "колонку" на вашому сайті, це буде вистачає.
Ще, звичайно, хотілося б зробити щось начеб простого "файл-менеджера", який би дозволив користувачеві хоч би видаляти непотрібні файли з його каталога. Про те, як реалізувати таку можливість - в главі 10 цієї книги.
Проте описані вище сценарії мають один вельми істотний недолік, який, зокрема, вельми утрудняє завантаження великих файлів. Звернете увагу, що перехід на сторінку з сценарієм, оброблювальним завантажений файл і що поміщає його в потрібну теку, а заразом і перевіряючим правильність пароля користувача, можливий лише після повного завантаження файлу. Т. е. користувачеві, який ввів невірний пароль, все одно доведеться чекати закінчення даремного завантаження його файлу на сервер, витрачаючи на це свій час в Мережі і трафік. Якщо завантажувані файли маленькі, то це ще як можна потерпіти, а якщо вони мають мегабайтниє розміри? Адже тоді цілком можна чекати скарг від розсерджених користувачів, що витратили по півгодини часу в Інтернеті на те, щоб взнати врешті-решт, що їх пароль неправильний...
Тому для створення повноцінного сервісу розміщення призначених для користувача файлів необхідна ще і служба авторизації користувачів, що дозволяє їм, одного разу ввівши логін і пароль, надалі при роботі на вашому сайті їх вже не перевіряти. Створенню такої служби також буде присвячена наступна глава цієї книги.

 
 
На правах реклами: 1 2

:: Меню ::

ГОЛОВНА

Введення

Небагато про Web-программировании

PHP: Історія. Місця. Джерела.

PHP: Основи

PHP: Вибіркове завантаження

PHP: Простий інтернет-магазин

PHP: Папкопотрошилка

PHP: Закачування файлів

PHP: Авторизація доступу

PHP: Гостьова книга

PHP: Система оцінки матеріалів

PHP: Файловий менеджер

PHP: Корисні дрібниці

PHP: Способи передачі даних між окремими сторінками

Висновок

Додаток 1. Перетвори свій сайт на портал

Додаток 2. Використовуй те, що під рукою - і не шукай завжди інше

Додаток 3. На сайті - як в "Вінде"


:: Реклама ::

  Настройка і оптимізація комп'ютера

 

:: Статистика ::

  Індекс цитування

:: Навігація ::

Головна

Гостьова книга

Додати у вишукане  

 

 

 


Copyright © Asentli, 2008