jQuery AJAX завантаження файлів на сервер
Як завантажувати будь-які файли, наприклад, картинки на сервер за допомогою AJAX та jQuery? Робиться це досить просто! І нижче ми всі докладно розберемо.
У ті «стародавні» часи, коли ще не було jQuery, а може він був, але браузери були не так наворочені, завантаження файлу на сайт за допомогою AJAX була нудною: через всякі милиці на кшталт iframe. Я той час не застав, та й кому це тепер цікаво. А цікаво тепер інше – що збереження файлів на сайт робиться дуже просто. Навіть веб-майстер, який не володіє досвідом і розумінням того, як працює AJAX, зможе швидко розібратися що-куди. А ця стаття йому на допомогу. Якщо підкріпити ці можливості функціями WordPress , то безпечна обробка та завантаження файлів на сервер стає дуже плевою і навіть цікавою справою (приклад з WordPress дивіться наприкінці статті).
Однак, як би все просто не було, потрібно помітити, що мінімальний досвід роботи з файлами та базові знання в Javascript, jQuery та PHP все ж таки необхідні! Мінімум, потрібно представляти як завантажуються файли на сервер, як загалом працює AJAX і хоч трохи треба вміти читати та розуміти код.
Нижче описаний метод досить стабільний, і по суті спирається на Javascript об’єкт new FormData() , базова підтримка якого є у всіх браузерах.
Для зрозумілішого сприйняття матеріалу, він розділений на кроки. На цьому все полетіли…
Дивіться також: плагін для спрощення роботи з AJAX в WordPress .
AJAX Завантаження файлів: загальний приклад
Починається все з наявності на сайті input поля типу file . Не потрібно, щоб це поле було частиною форми (тега <form> ).
Таким чином, у нас є HTML код із file полем та кнопкою «Завантажити файли».
<input type="file" multiple="multiple" accept=".txt,image/*"> <a href="#" class="upload_files button">Завантажити файли</a> <div class="ajax-reply"></div>

Крок 1. Дані з поля файлу
Першим кроком, потрібно отримати дані файлів, що завантажуються.
При натисканні на file-поле, з’являється вікно вибору файлів, після вибору, дані про них зберігаються в полі, а нам потрібно їх від туди «забрати». Для цього повісимо на подію change JS функцію, яка зберігатиме наявні дані file-поля в JS змінну files :
var files; // Змінна. міститиме дані файлів
// Заповнюємо змінну даними, при зміні значення поля file
$('input[type=file]').on('change', function(){
files = this.files;
});
Крок 2. Створюємо AJAX запит (на кліку)
Дані файлів у нас є, тепер їх потрібно надіслати через AJAX. Вішаємо цю подію на клік на кнопку «Завантажити файли».
У момент кліка створюємо новий об’єкт new formData() і додаємо до нього дані зі змінної files . За допомогою formData() ми доб’ємося того, що дані, що надсилаються, будуть виглядати, начебто ми просто сабмітили форму в браузері.
Далі з наявних даних форми створюємо нестандартний AJAX запит, в якому передаємо файли в стандартному для сервера форматі: $_FILES .
Щоб такий запит відбувся, в jQuery потрібно вказати додаткові параметри AJAX, тому звична функція $.post() не підходить і ми використовуємо більш гнучкий аналог: $.ajax() .
Два важливі додаткові параметри потрібно встановити в false:
- processData
- Вимикає обробку даних, що передаються. За промовчанням, наприклад, для GET запитів jQuery збирає дані до рядка запиту і додає цей рядок до кінця URL. Для даних POST робить інші перетворення. Нам будь-які зміни вихідних даних заважатимуть, тому відключаємо цю опцію.
- contentType
- Вимикає встановлення заголовка типу запиту. Дефолтна установка jQuery дорівнює
“application/x-www-form-urlencoded . Такий заголовок не передбачає відправлення файлів. Якщо встановити цей параметр в
“multipart/form-data” , PHP все одно не зможе розпізнати дані, що передаються, і виведе попередження «Missing boundary multipart/form-data»… Загалом, найпростіше відключити цю опцію, тоді все працює!
// обробка та відправка AJAX запиту при натисканні на кнопку upload_files
$('.upload_files').on( 'click', function( event ){
event.stopPropagation(); // зупинка всіх поточних JS подій
event.preventDefault(); // зупинка дефолтної події для поточного елемента - клік для тега
// нічого не робимо якщо files порожній
if( typeof files == 'undefined' ) return;
// Створимо об'єкт даних форми
var data = новий FormData();
// заповнюємо об'єкт даних файлами у відповідному для відправки форматі
$.each( files, function( key, value ){
data.append (key, value);
});
// додамо змінну для ідентифікації запиту
data.append( 'my_file_upload', 1);
// AJAX запит
$.ajax({
url : './submit.php',
type : 'POST', // важливо!
data : data,
cache : false,
dataType : 'json',
// відключаємо обробку даних, що передаються, нехай передаються як є
processData : false,
// відключаємо встановлення заголовка типу запиту. Так jQuery скаже серверу, що це рядковий запит
contentType : false,
// функція успішної відповіді сервера
success : function( respond, status, jqXHR ){
// ОК - файли завантажені
if( typeof respond.error === 'undefined' ){
// виведемо шляхи завантажених файлів до блоку '.ajax-reply'
var files_path = respond.files;
var html = '';
$.each( files_path, function( key, val ){
html += val +'<br>';
} )
$('.ajax-reply').html(html);
}
// помилка
else {
console.log('ПОМИЛКА:' + respond.data);
}
},
// функція помилки відповіді сервера
error: function( jqXHR, status, errorThrown ){
console.log( 'ПОМИЛКА AJAX запиту: ' + status, jqXHR );
}
});
});
Крок 3. Обробляємо запит: завантажуємо файли на сервер
Тепер останній крок: потрібно опрацювати надісланий запит.
Щоб наочно обробимо запит без додаткових перевірок для файлів, тобто. просто збережемо отримані файли у потрібну папку. Хоча, для безпеки, файли, що відправляються, обов’язково потрібно перевіряти, хоча б розширення (тип) файлу…
Створимо файл submit.php з таким кодом (передбачається, що submit.php лежить у тій же папці, де і файл, з якого відправляється AJAX запит):
<?php
if( isset( $_POST['my_file_upload'] ) ){
// ВАЖЛИВО! тут повинні бути всі перевірки безпеки файлів, що передаються, і вивести помилки якщо потрібно
$uploaddir = './uploads'; //. - поточна папка, де знаходиться submit.php
// Створимо папку якщо її немає
if(! is_dir($uploaddir)) mkdir($uploaddir, 0777);
$files = $_FILES; // Отримані файли
$done_files = array();
// Перемістимо файли з тимчасової директорії у вказану
foreach( $files as $file ){
$file_name = $file['name'];
if( move_uploaded_file( $file['tmp_name'], "$uploaddir/$file_name" ) ){
$done_files[] = realpath("$uploaddir/$file_name");
}
}
$data = $done_files? array('files' => $done_files ) : array('error' => 'Помилка завантаження файлів.');
die (json_encode ($ data));
}От і все!
Важливо! Цей код лише показує, як отримувати та зберігати файли. Насправді, вам потрібно перевірити формати файлів, їх розмір, транслітерувати кириличні назви і можливо робити якісь ще перевірки.
–
Щоб не збирати частинами вищеописаний код завантаження, пропоную його завантажити.
Скопіюйте вміст архіву на ваш php сервер, зайдіть у головну паку (у браузері) і спробуйте завантажити файли. Так, ви «наживо» побачите що і як працює.
Читайте також:
AJAX Завантаження файлів: приклад для WordPress
Для WordPress обробляти AJAX запит у рази простіше, тому що є media_handle_upload() .
Перший і другий крок аналогічні, а в третьому кроці будемо використовувати вбудовану функцію, яка додасть файл до медіатеки та прив’яже його до поточного посту.
Щоб код нижче почав працювати, його потрібно додати до файлу теми functions.php . Далі створити сторінку з ярликом ajax_file_upload і зайти на цю сторінку. У контенті ви побачите форму для додавання файлу. Вибираєте файли і перевіряєте, чи все завантажилося…
Це повноцінний приклад того, як безпечно завантажити файли на сервер серед WordPress.
