Обробка завантажених файлів

завдання
Необхідно обробити файл, завантажений користувачем.

Рішення
Використовуйте масив $ _FILES:
// з if (is_uploaded_file ($ _ FILES [ 'event'] [ 'tmp_name'])) readfile ($ _ FILES [ 'event'] [ 'tmp_name']); // виводимо файл на екран
>

Обговорення
Починаючи з версії PHP 4.1 всі завантажені файли з'являються в суперглобального масиві $ _FILES. Для кожного файлу в ньому є чотири інформаційних розділу:

Ім'я, присвоєне елементу введення форми.
type

Тип MIME-файлу.
size

Розмір файлу в байтах.
tmp_name

Тимчасове місце розташування файлу на сервері.

У більш ранніх версіях PHP замість цього масиву необхідно використовувати масив $ HTTP_POST_FILES.1

Після вибору файлу з масиву використовуйте функцію is_uploaded_file () для підтвердження того, що файл, який потрібно обробити, дійсно завантажений користувачем, потім обробіть його таким же чином, як і інші файли в системі. Завжди поступайте таким чином. Якщо ви сліпо довіряєте іменах файлів, наданих користувачем, хтось може змінити запит і додати імена, такі як / etc / passwd в список для обробки.

Можна також перемістити файл на постійне місце розташування; для безпечного переміщення файлу використовуйте функцію move_uploaded_file ():

// переміщаємо файл: функція move_uploaded_file () також виконує
// перевірку файлів на легітимність, тому немає необхідності
// викликати ще й функцію is_uploaded_file ()
move_uploaded_file ($ _ FILES [ 'event'] [ 'tmp_name'], '/path/to/file.txt');

Зверніть увагу, що значення, збережене в змінної tmp_name, являє собою повний шлях до файлу, а не просто ім'я файлу.


Використовуйте функцію basename (), щоб виділити ім'я, якщо це необхідно.

Не забудьте переконатися, що PHP має права на читання і запис і в каталозі, куди записуються тимчасові файли (див. Параметр конфігурації upload_tmp_dir для перевірки його розташування) і в каталозі, куди ви збираєтеся копіювати файл. Часто це може бути користувач nobody або apache (замість вашого персонального імені користувача). Внаслідок цього, якщо ви працюєте в режимі safe_mode, після копіювання файлу в новий каталог, можливо, у вас вже не буде до нього доступу.

Обробка файлів нерідко є нетривіальне завдання, оскільки не всі браузери однаково уявляють одну і ту ж інформацію. Робити це слід робити дуже акуратно, в іншому випадку ви можете самі створити пролом в безпеці. Зрештою, зловмисники можуть отримати можливість завантажувати на вашу машину будь-які файли, зламати або зруйнувати вашу систему. Тому в PHP реалізовано кілька можливостей встановлювати обмеження на завантаження, включаючи повну заборону на завантаження будь-яких файлів. Тому, якщо ви відчуваєте труднощі при
обробці завантажених файлів, переконайтеся, що файл не відкидається через те, що він може становити ризик для безпеки.


Щоб виконати таку перевірку, спочатку переконайтеся, що параметр file_uploads в файлі конфігурації встановлено в оn. Потім перевірте, що розмір файлу не перевищує значення upload_max_filesize; за замовчуванням воно дорівнює 2Мбайт, що блокує будь-чиї спроби зруйнувати систему шляхом заповнення жорсткого диска гігантськими файлами.

Крім того, є параметр post_max_size, контролюючий максимальний розмір всіх даних POST, дозволений в одному запиті; початкове значення дорівнює 8 Мбайт.

Крім того, якщо не вибрано жодного файлу для завантаження, то версії PHP до 4.1 встановлюють параметр tmp_name в none; новіші версії привласнюють йому порожню рядок. Версія PHP 4.2.1 допускає файли нульової довжини.


Щоб переконатися, що файл завантажений і він не порожній (хоча, в залежності від обставин, це як раз те, що потрібно),
необхідно переконатися, що параметр tmp_name встановлений, а значення параметра size більше нуля. І нарешті, не всі браузери обов'язково надсилають той же тип MIME-файлу; то, що вони посилають, залежить від того, які типи файлів вони допускають.