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

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

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

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

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




enctype="multipart/form-data">
First Name:
Last Name:
Відправка зображення:

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

<script async="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">
<!-- 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, він повинен включати шлях і обов'язково ім'я.
Цікаво по темі
Відправка форми ajax на сервер за допомогою jquery
Відправка форми ajax на сервер за допомогою jquery
Як багато раз ви стикалися з тим, що ввели неправильні дані, з-за чого сторінка перезавантажувалася і повністю усувала введені в полях символи. Щоб
WPFFontCache_v0400.exe - що це за процес в "Диспетчері завдань"
WPFFontCache_v0400.exe - що це за процес в "Диспетчері завдань"
У цій статті ми поговоримо про програму WPFFontCache_v0400.exe - що це, які функції вона виконує і що робити, якщо споживає занадто багато ресурсів
PHP implode: перетворення одновимірних і багатовимірних масивів у рядки, сортування за допомогою числових індексів.
PHP implode: перетворення одновимірних і багатовимірних масивів у рядки, сортування за допомогою числових індексів.
Гнучкість і багатоваріантність застосування функції php implode(), об'єднання значень одновимірних і багатовимірних масивів у рядки, маніпулювання
Метод appendTo в jQuery: вставка елементів
Метод appendTo в jQuery: вставка елементів
Синтаксис і особливості використання методу appendTo в бібліотеці jQuery. Контекст виклику, вхідні параметри і значення, що повертається. Специфіка
Що таке динамічні масиви C++?
Що таке динамічні масиви C++?
Визначимося для початку з тим, що таке динамічний масив. З часів Сі існують масиви, але їх особливістю був фіксований розмір, який зазначався при
Як здійснити запис у файл Java
Як здійснити запис у файл Java
При написанні програм на мові Java рано чи пізно постане необхідність читання і запису інформації в файл. Для цього в мові передбачені наступні