Як завантажити файл за допомогою функції PHP move_uploaded_file
Форма для збору даних
PHP підтримує завантаження будь-яких файлів методом POST. Тому для передачі даних сервера, або збереження їх на локальну машину потрібна HTML-форма. З допомогою розмітки виділіть окреме місце, де щоб користувач міг вибрати файл. Сценарії потрібно налаштувати все так, щоб дані відправлялися без збоїв. Розглянемо цей процес на прикладі завантаження фотографії профілю. enctype="multipart/form-data">
First Name:
Last Name:
Відправка зображення:
Зверніть увагу на атрибут enctype="multipart/form-data". Саме завдяки йому форма налаштована на отримання даних. Щоб користувачі не придумали завантажувати котиків на 25 Мбайт, у полі hidden потрібно обов'язково встановити обмеження на розмір картинок. Для зображення профілю цілком достатньо 2 Мбайт, як у цьому прикладі.
<!-- fb_336x280_2 -->
<script> (adsbygoogle = window.adsbygoogle ||[]).push({});
Відправка зображення
У формі вище в атрибуті action варто означає , що прийом і обробка зображення буде відбуватися у цьому ж документі. Якщо вас це бентежить і ви хочете, щоб для кожної дії був свій окремий скрипт, вставити на місце конструкції ім'я сценарію, наприклад, create_profile.php. Тепер весь код включаючи роботу з функцією PHP move uploaded file , записуйте в цьому файлі.
'Перевищено макс. розмір файлу, вказаний в php.ini',
2 => 'Перевищено макс. розмір файлу, зазначений у формі HTML',
3 => 'Була відправлена лише частину файлу',
4 => 'Файл для відправки не був обраний.');
//перевірка помилки при відправленні файлу
($_FILES[$image_fieldname] ['error']==0) or
die("помилка при відправці файлу". $php_errors[$_FILES[$image_fieldname] ['error']]);
//перевірити нормальний файл відправляють, або це спроба злому
@is_uploaded_file($_FILES[$image_fieldname] ['tmp_name']) or
die('Ви совершиете аморальний вчинок, ганьба!'."Ім'я файлу: "."'{$_FILES[$image_fieldname] ['tmp_name']}'");
//чи є запропонований файл зображенням
@getimagesize($_FILES[$image_fieldname] ['tmp_name']) or die("Помилка! обраний Вами файл не є зображенням". "Ім'я файлу {$_FILES[$image_fieldname] ['tmp_name']}");
//присвоєння завантажуваного файлу унікального імені
$now = time();
while(file_exists($upload_filename = $uploads_dir.$now.'-'.$_FILES[$image_fieldname] ['name'])){
$now++;
}
?>
У коді присутні допоміжні змінні:
<script type="text/jаvascript">
var blockSettings2 = {blockId:"R-A-271049-5",renderTo:"yandex_rtb_R-A-70350-39",async:!0};
if(document.cookie.indexOf("abmatch=") >= 0) blockSettings2.statId = 70350;
!function(a,b,c,d,e){a[c]=a[c]||[],a[c].push(function(){Ya.Context.AdvManager.render(blockSettings2)}),e=b.getElementsByTagName("script")[0],d=b.createElement("script"),d.type="text/jаvascript",d.src="//an.yandex.ru/system/context.js",d.async=!0e.parentNode.insertBefore(d,e)}(this,this.document,"yandexContextAsyncCallbacks");
- $Upload_dir прописаний шлях до директорії для завантаження. Замість HOSW_WWW_ROOT пишіть абсолютний шлях до робочого каталогу на сервері або на комп'ютері.
- Змінна $image_fieldname - це ім'я поля зображення в HTML-формі.
Як бачите, перед викликом move uploaded file знаходяться рядки, які виконують перевірку завантажуваного зображення. Звичайно, безпечні PHP-додатки — це міф, але повинна бути хоча б мінімальна захист.
Масив перевірки помилок $php_errors починається не з нуля, а з одиниці. Під індексом[0]коштує $_FILES[$image_fieldname] ['error'], який у разі вдалого завантаження повертає число 0. В PHP $_FILES - це спеціальний масив, що містить всю інформацію про файл. Для доступу до цих даних використовується індекс з ім'ям поля введення, яке ми раніше вивели в окрему змінну $image_fieldname:
<script type="text/jаvascript">
var blockSettings3 = {blockId:"R-A-271049-6",renderTo:"yandex_rtb_R-A-70350-44",async:!0};
if(document.cookie.indexOf("abmatch=") >= 0) blockSettings3.statId = 70350;
!function(a,b,c,d,e){a[c]=a[c]||[],a[c].push(function(){Ya.Context.AdvManager.render(blockSettings3)}),e=b.getElementsByTagName("script")[0],d=b.createElement("script"),d.type="text/jаvascript",d.src="//an.yandex.ru/system/context.js",d.async=!0e.parentNode.insertBefore(d,e)}(this,this.document,"yandexContextAsyncCallbacks");
//перевірка помилки при відправленні файлу
($_FILES[$image_fieldname] ['error']==0) or
die("помилка при відправці файлу". $php_errors[$_FILES[$image_fieldname] ['error']]);
Коли move uploaded file PHP не працює
Вам здається, що ви все зробили правильно, а інтерпретатор видає помилку? Файл відмовляється завантажуватися в призначену директорію і з'являється в абсолютно несподіваних місцях? В першу чергу перевірте php.ini на дозволений розмір в параметрі upload_max_filesize. Найчастіше така помилка виникає у Denver. Тому відкрийте php.ini (зазвичай він знаходиться в папці php) і просто встановіть потрібний вам розмір:
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;
; Whether to allow HTTP file uploads.
; http://php.net/file-uploads
file_uploads=On
; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
; http://php.net/upload-tmp-dir
upload_tmp_dir="***"
; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize=5M
; Maximum number of files that can be uploaded via a single request
max_file_uploads=50
Якщо ви працюєте на сервері, поцікавтеся у провайдера, файли якого розміру дозволено завантажувати. На безкоштовному хостингу максимальний обсяг зазвичай 2 Мбайта. Друга причина, за якою код може давати збій, — невірно призначена директорія. Перевірте другий аргумент функції move_uploaded_file, він повинен включати шлях і обов'язково ім'я.