Як завантажити текстовий файл в поле php. Завантаження файлів на сервер за допомогою PHP
Радий бачити Вас на сторінках свого сайту. Сьогодні поговоримо про реалізацію завантаження файлів на сервер. Тема досить цікава тому багатьох новачків цікавить дане питання.
Завантаження файлів на сервер засобами PHP значно полегшить Вашу працю по наповненню фотогалереї або оформлення сторінки сайту за допомогою редактора (наприклад TinyMCE). Також Ви можете завантажувати будь-які типи файлів на сервер виходячи з Ваших завдань.
Для того щоб завантажити файл на сервер потрібно створити форму для завантаження файлів. В принципі дана форма не дуже сильно відрізняється від звичайної форми з текстовими полями, за винятком, що type буде не text, а file (Так як ми вантажимо файли) і в самій формі додасться атрибут enctype \u003d "multipart / form-data". Entype визначає вид кодування, яку браузер застосовує до параметрів форми.
Демо: Завантаження файлів на сервер
Форму завантаження файлів ми зробили, саме час написати простий обробник для завантаження файлів на сервер. Визначимо відразу, що вантажити будемо тільки графічні файли з типом jpeg, png, gif. Після того як ми визначили типи файлів для завантаження на сервер, нам потрібно створити папку на самому сервері, куди ми будемо складати наші файли. У моєму прикладі це папка image, в неї ми будемо складати наші файли.
"Помилок не виникло, файл був успішно завантажений на сервер.", 1 \u003d\u003e "Розмір прийнятого файлу перевищив максимально допустимий розмір, який заданий директивою upload_max_filesize конфігураційного файлу php.ini.", 2 \u003d\u003e "Розмір завантаження перевищив значення MAX_FILE_SIZE, вказане в HTML-формі. ", 3 \u003d\u003e" Завантажуваний файл був отриманий тільки частково. ", 4 \u003d\u003e" Немає запису був завантажений. ", 6 \u003d\u003e" Відсутня тимчасова папка. Додано в PHP 4.3.10 і PHP 5.0.3 . "); // Визначаємо типи файлів для завантаження $ fileTypes \u003d array ( "jpg" \u003d\u003e "image / jpeg", "png" \u003d\u003e "image / png", "gif" \u003d\u003e "image / gif"); // Якщо натиснута кнопка завантажити if (isset ($ _ POST [ "upload"])) (// Перевіряємо порожні дані чи ні if (! Empty ($ _ FILES)) (// Перевіряємо на помилки if ($ _ FILES [ "files" ] [ "error"]\u003e 0) $ err \u003d $ errUpload [$ _ FILES [ "files"] [ "error"]]; // Перевірюємо тип файлу для завантаження if (! in_array ($ _ FILES [ "files"] [ " type "], $ fileTypes)) $ err \u003d" Даний тип файлу ". $ _FILES [" files "] [" type "]." не підходить для завантаження! "; // Якщо немає помилок то вантажимо файл if (empty ($ err)) ($ type \u003d pathinfo ($ _ FILES [" files "] [" name "]); $ name \u003d $ uploadDir." / ". uniqid (" files_ ").". ". $ type [" extension "]; move_uploaded_file ($ _ FILES [" files "] [" tmp_name "], $ name); // Скидаємо POST параметри header (" Location : http: // ". $ _SERVER [" HTTP_HOST "]." / less / uploads / uploads.php? name \u003d ". $ name); exit;) else echo implode ("
", $ Err);)) // Повідомлення про успішну завантаженні файлу на сервер if (isset ($ _ GET [" name "])) echo"
файл ". Htmlentities ($ _ GET [" name "])." успішно завантажений!
"; // Виводимо картинки з каталогу $ imgDir \u003d array_values \u200b\u200b(array_diff (scandir ($ uploadDir), array (" .. ",". "))); For ($ i \u003d 0; $ i< count($imgDir); $i++) { if($i % 2 == 0) echo ""." \\ N "; echo" "." \\ N ";) echo"
"." \\ N "; echo" http: // ". $ _SERVER [" HTTP_HOST "]." ";?\u003e
Після того як ми написали код, перевірили що все працює, новачок може зіткнуться з проблемою завантаження великих файлів. Для це потрібно поправити настройки в PHP.INI
; Максимальний час виконання кожного скрипта в секундах max_execution_time \u003d 3000; Максимальна кількість часу кожен сценарій може витратити розбору запиту даних max_input_time \u003d 400; Максимальний обсяг пам'яті, скрипт може споживати (8 МБ) memory_limit \u003d 500M; Максимальний розмір даних POST, що PHP буде приймати. post_max_size \u003d 500M; Максимально допустимий розмір для завантаження. upload_max_filesize \u003d 200M
Дійсно, завантаження файлів є важливою особливістю багатьох сайтів і веб-додатків, які ми використовуємо щодня. У цій статті я покажу Вам, ще один спосіб для завантаження файлів за допомогою PHP.
вимоги
Завантажити файли на сервер не складно, але є кілька дрібних деталей, які повинні бути враховані, інакше завантаження не буде виконана. По-перше, ви повинні переконатися, що PHP налаштований на дозвіл завантаження. перевірте ваш php.ini файл і перевірте директиву file_uploads, яка повинна бути встановлена \u200b\u200bв On.
Після того як Ви налаштували конфігурації дозволяють сервера приймати завантажені файли, Ви можете акцентувати вашу увагу на HTML складової. Для завантаження файлів з боку HTML застосовуються форми. Вкрай важливо, щоб ваші форми використовували метод POST і для атрибута enctype мали значення multipart / form-data.
<form action \u003d "upload.php" method \u003d "post" enctype \u003d "multipart / form-data"\u003e |
Написання сценарію для процесу завантаження
Процес завантаження файлу в загальних рисах виглядає так:
- Відвідувач переглядає HTML сторінку з формою для завантаження файлів;
- Відвідувач вибирає в формі файл, який він хоче завантажити;
- Браузер кодує файл і відправляє його в якості частини POST запиту;
- PHP отримує форму подання, декодує файл і зберігає його в тимчасовий каталог на сервері;
- Далі PHP скрипт переміщує файл на постійне місце зберігання.
Отже для того щоб відвідувач зміг завантажити файл необхідна HTML-форма, яка буде надана користувачеві і PHP скрипт, щоб піклуватися про завантаження файлів на сервер.
HTML форма
HTML форми забезпечують інтерфейс, через який користувач ініціює завантаження файлів. Пам'ятайте, form елемент повинен мати method \u003d POST і не повинен кодувати дані при відправці на сервер - атрибут enctype в значення multipart / form-data. Маємо в своєму розпорядженні елемент input для вибору файлу. Як і для будь-якого іншого елемента форми, нам дуже важливо вказати значення атрибута name, щоб можна було посилатися на нього в PHP сценарії, який обробляє форму.
Форма завантаження файлів виглядає наступним чином:
1 |
Варто відзначити, що різні браузери відображають поле файл по-різному. Це не проблема, так як користувачі звикли до того як виглядає поле вибору файлу в їхньому улюбленому браузері. Однак якщо зовнішність важлива для Вас, я рекомендую вам ознайомитися з цією статтею.
PHP сценарій завантаження
Інформація про завантаження розташовується в багатовимірному масиві $ _FILES. Цей масив індексується по іменах файлів поміщених в поле HTML форми. Масив містить наступну інформацію про кожен файл:
- $ _FILES [ «myFile»] [ «name»] - вихідне ім'я файлу;
- $ _FILES [ «myFile»] [ «type»] - MIME-тип файлу;
- $ _FILES [ «myFile»] [ «size»] - розмір файлу (в байтах);
- $ _FILES [ «myFile»] [ «tmp_name»] - ім'я тимчасового файлу;
- $ _FILES [ «myFile»] [ «error»] - код будь-якої помилки при передачі.
Функція move_uploaded_file () переміщує завантажений файл з тимчасового в постійне місце. Вам слід завжди використовувати move_uploaded_file () замість copy () і rename () для цієї мети, оскільки вона виконує додаткову перевірку, щоб переконатися, що файл був дійсно завантажений за допомогою запиту HTTP POST.
Якщо ви плануєте зберігати файл з реальним ім'ям, то потрібно дотримати кілька правил. Файл не повинно містити такі символи як слеш, які можуть вплинути на розташування. Назва не повинно збігатися з назвою вже існуючих файлів, щоб не переписати їх. Замінюємо будь-які символи не є буквою або цифрою на нижнє підкреслення, і додаємо «збільшувальне» число при збігу імен.
Отримання і обробка завантаження файлів за допомогою PHP виглядає наступним чином:
1 | // директорія для збереження файлу if (! empty ($ _FILES [ "myFile"])) ( // перевіряємо на наявність помилок при завантаженні Виникла помилка. // забезпечуємо безпечне найменування файлу // при збігу імен файлів додаємо номер // переміщаємо файл в постійне місце зберігання // задаємо права на новий файл echo " Файл ". $ Name. "Успішно завантажений. " ;} |
Спочатку перевіряємо файл, завантажений він без будь-яких помилок. Потім визначаємо безпечне ім'я файлу, а потім поміщає файл в остаточний каталог за допомогою move_uploaded_file (). І в кінці встановлюємо права на доступ до файлу.
питання безпеки
Більшість з нас не дозволили б завантажувати і зберігати абсолютно незнайомі файли у себе на сервері, але на жаль в поточній ситуації це так і є. Тому слід описати кілька кроків, які дозволять звести до мінімуму ризики, пов'язані з безпекою при завантаження файлів.
Один з них полягає в перевірці типу завантаження. Спиратися на значення зберігається в $ _FILES [ «myFile»] [ «type»] «не є добре», так як розширення в імені файлів можуть бути легко підроблені. У таких ситуація краща проаналізувати вміст файлу, наприклад використання функції exif_imagetype () дозволяє визначити, чи дійсно завантажений файл є картинкою з розширенням GIF, JPEG і тд. Якщо exif_imagetype () недоступна (функція вимагає розширення Exif), То ви можете використовувати getimagesize (). Повертається масив буде містити розміри і тип зображення.
1 | ...
|
Для не-графічних файлів, ви можете використовувати Exec () для виклику утиліти Unix - File. Дана утиліта визначає тип файлу.
Інший крок, який ви можете зробити для посилення безпеки при завантаженні файлів, це накласти жорсткі обмеження на загальний розмір запиту POST і кількість файлів, які можуть бути завантажені. Щоб зробити це, необхідно вказати відповідне значення для директив upload_max_size, post_max_size і max_file_uploads в файлі php.ini.
- upload_max_size визначає максимальний розмір файлів.
- На додаток до розміру завантаження, ви можете обмежити розмір запит POST завдяки директиві post_max_size.
- max_file_uploads більш нова директива (додана у версії 5.2.12), яка обмежує кількість завантажених файлів.
post_max_size \u003d 8M |
Третій крок (кілька екзотичний), який ви можете зробити, щоб звести до мінімуму ризик при завантаженні файлів - сканування антивірусним сканером. Варто додати, що дана тема є дуже серйозною, тому їй слід приділити достатньо уваги при розробці веб-додатків!
Таким чином відбувається завантаження файлів на сервер за допомогою PHP. Якщо у Вас є зауваження або доповнення до цієї статті, залишайте їх у коментарях. Спасибі за прочитання!
P.S. У вас сайт на движку Joomla і ви користуєтеся послугами хостингу? Для тих хто домагається максимальної продуктивності інтернет-проектів, варто спробувати хостинг з joomla. Спеціалізований хостинг для сайтів на Joomla забезпечить стабільну і ефективну роботу, а вигідні тарифні плани нікого не залишать байдужими.
Останнє оновлення: 1.11.2015
Щоб завантажити файл на сервер, нам треба використовувати форму з параметром enctype \u003d "multipart / form-data" і масив $ _FILES. Отже, створимо файл upload.php наступного змісту:
завантаження файлу
Тут визначена форм з атрибутом enctype \u003d "multipart / form-data". Форма містить спеціальне поле для вибору файлу.
Всі файли файли потрапляють в асоціативний масив $ _FILES. Щоб визначити, а чи є взагалі завантажені файли, можна використовувати конструкцію if: if ($ _FILES)
Масив $ _FILES є двовимірним. Ми можемо завантажити набір файлів, і кожен завантажений файл можна отримати по ключу, який збігається зі значенням атрибута name.
Так як елемент для завантаження файлу на формі має name \u003d "filename", то даний файл ми можемо отримати за допомогою виразу $ _FILES [ "filename"].
У кожного об'єкта файлу є свої параметри, які ми можемо отримати:
$ _FILES [ "file"] [ "name"]: ім'я файлу
$ _FILES [ "file"] [ "type"]: тип вмісту файлу, наприклад, image / jpeg
$ _FILES [ "file"] [ "size"]: розмір файлу в байтах
$ _FILES [ "file"] [ "tmp_name"]: ім'я тимчасового файлу, збереженого на сервері
$ _FILES [ "file"] [ "error"]: код помилки при завантаженні
Також ми можемо перевірити наявність помилок при завантаженні. Якщо у нас немає помилки, то поле $ _FILES [ "filename"] [ "error"] містить значення UPLOAD_ERR_OK.
При відправці файлу на сервер він спочатку завантажується у тимчасове місце, з якого потім за допомогою функції move_uploaded_file () він переміщається в каталог сервера.
Функція move_uploaded_file () приймає два параметри шлях до завантаженого тимчасового файлу і шлях, куди треба помістити долучення.
Обмеження і чи потрібно завантажувати
За замовчуванням розмір файлів обмежений 2 мб. Однак можна налаштувати даний показник в файлі конфігурації. Змінимо цей показник, наприклад, до 10 мб. Для цього знайдемо в файлі php.ini наступний рядок:
Upload_max_filesize \u003d 2M
Змінимо її на
Upload_max_filesize \u003d 10M
Також ми можемо налаштувати папку для тимчасових файлів, що завантажуються. Для цього в файлі php.ini знайдемо такий рядок:
; Upload_tmp_dir \u003d
Змінимо її на
Upload_tmp_dir \u003d "C: / php / upload"
Також в каталозі php нам треба створити папку upload.
мультизагрузка
змінимо скрипт upload.php так, щоб він підтримував множинну завантаження:
$ Error) (if ($ error \u003d\u003d UPLOAD_ERR_OK) ($ tmp_name \u003d $ _FILES [ "uploads"] [ "tmp_name"] [$ key]; $ name \u003d $ _FILES [ "uploads"] [ "name"] [$ key]; move_uploaded_file ($ tmp_name, "$ name");)))?\u003e
завантаження файлу
Кожне поле вибору файлу має атрибут name \u003d "uploads", тому сервер буде розглядати набір відправлених файлів як єдиний масив.
Потім використовуючи цикл foreach, проходимо по всі файлів і зберігаємо їх в каталог веб-сайту.
Додаток для завантаження файлів на сервер являє собою HTML-форму (upload.html) і скрипт upload.php для її обробки.
зауваження: Ви можете завантажити промислову версію системи завантаження файлів на сервер з розділу. Система дозволить вам не тільки завантажити файл на сервер, але і змінити його розмір, фон і ін.
Код форми (upload.html)
Форма для завантаження файлів