Як завантажити файл за допомогою функції PHP move_uploaded_file

17 0 Новини високих технологій

В якийсь момент своєї кар'єри ви захочете створювати справжні динамічні веб-додатки. Може вирішите написати свою соціальну мережу. Як розробник ви будете намагатися зацікавити користувачів, дати їм можливість завантажувати фотографії, музику, обмінюватися файлами. На цей випадок вам необхідно знати і вміти працювати з функцією PHP move uploaded file.

Як завантажити файл за допомогою функції PHP move_uploaded_file

Форма для збору даних

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




enctype="multipart/form-data">











Зверніть увагу на атрибут enctype="multipart/form-data". Саме завдяки йому форма налаштована на отримання даних. Щоб користувачі не придумали завантажувати котиків на 25 Мбайт, у полі hidden потрібно обов'язково встановити обмеження на розмір картинок. Для зображення профілю цілком достатньо 2 Мбайт, як у цьому прикладі.

<script async="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">
<!-- fb_336x280_2 -->

<script> (adsbygoogle = window.adsbygoogle ||[]).push({});
Як завантажити файл за допомогою функції PHP move_uploaded_file

Відправка зображення

У формі вище в атрибуті 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/javascript">
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/javascript",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/javascript">
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/javascript",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, він повинен включати шлях і обов'язково ім'я.