В этой заметке вы узнаете, как реализовать AJAX загрузку файлов на сервер с использованием jQuery. Это не так уж сложно!
Не знаю точно, но что-то мне подсказывает, что до появления jQuery загрузка файлов на сервер по AJAX технологии была чем-то очень непонятным, а значит крайне сложным. Но сегодня с появлением jQuery даже не обладающий опытом веб-мастер может сделать это без особых усилий. Однако, так или иначе, разобраться все же придется. И сейчас я попробую очень коротко и понятно объяснить вам, как это делается, а чтобы проще было воспринимать, урок содержит только нужное и разбит на шаги.
Замечу заранее, что эта статья вряд ли поможет, если вы совсем плохо разбираетесь в jQuery и PHP, базовые знания обязательны. И, пожалуй, обязательно иметь хоть какой-то опыт в загрузке файлов (картинок) на сервер с обычной HTML формы, по крайней мере нужно представлять как это работает.
Ну, меньше слов, приступим!
Для начала предположим, что у нас есть такой HTML код: поле и кнопка загрузки:
|
1
2
3
|
<input type="file" multiple="multiple" accept=".txt,image/*"><a href="#" class="submit button">Загрузить файлы</a><div class="ajax-respond"></div> |
Содержание
1. Получение данных файла из поля file
Первое что нам нужно сделать — это получить данные input поля при добавлении в него файла(ов). Для этого прикрепим к событию change свою функцию, которая установит данные файла:
|
1
2
3
4
5
6
7
8
9
10
|
// Переменная куда будут располагаться данные файловvar files;// Вешаем функцию на событие// Получим данные файлов и добавим их в переменную$('input[type=file]').change(function(){ files = this.files;}); |
Этот код сохранит данные поля type=»file» в переменную files, с которой мы будем работать дальше.
2. Загружаем файлы по клику
Теперь, нам нужно повесить событие клика на кнопку «Загрузить файлы». Тут и будет посылаться AJAX запрос с данными файлов.
Создадим функцию, повесим ее на событие click и отправим AJAX запрос с данными файлов. Этот запрос отличается от обычного AJAX запроса, и тут не подходит обычная отправка POST данных:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
// Вешаем функцию ан событие click и отправляем AJAX запрос с данными файлов$('.submit.button').click(function( event ){ event.stopPropagation(); // Остановка происходящего event.preventDefault(); // Полная остановка происходящего // Создадим данные формы и добавим в них данные файлов из files var data = new FormData(); $.each( files, function( key, value ){ data.append( key, value ); }); // Отправляем запрос $.ajax({ url: './submit.php?uploadfiles', type: 'POST', data: data, cache: false, dataType: 'json', processData: false, // Не обрабатываем файлы (Don't process the files) contentType: false, // Так jQuery скажет серверу что это строковой запрос success: function( respond, textStatus, jqXHR ){ // Если все ОК if( typeof respond.error === 'undefined' ){ // Файлы успешно загружены, делаем что нибудь здесь // выведем пути к загруженным файлам в блок '.ajax-respond' var files_path = respond.files; var html = ''; $.each( files_path, function( key, val ){ html += val +'<br>'; } ) $('.ajax-respond').html( html ); } else{ console.log('ОШИБКИ ОТВЕТА сервера: ' + respond.error ); } }, error: function( jqXHR, textStatus, errorThrown ){ console.log('ОШИБКИ AJAX запроса: ' + textStatus ); } });}); |
Что делает функция? Создает новый объект new formData(), добавляет в него данные файлов из массива files. Затем этот объект данных формы передается в AJAX запрос. 2 параметра нужно установить в false обязательно:
- processData — потому что jQuery будет конвертировать массив files в строку, и сервер не сможет получить данные.
- contentType — потому что дефолтные установки jQuery равны application/x-www-form-urlencoded, что не предусматривает отправку файлов. А еще, если установить этот параметр в multipart/form-data, похоже это ничего не даст.
3. Загрузка файлов на сервер
Чтобы наглядно показать, как обрабатывать отправленный во втором пункте запрос, приведу простой php-скрипт, без всяких проверок.
Создадим файл submit.php и добавим в него этот код (предполагается что submit.php лежит в той же папке, где и файл, с которого отправляется AJAX запрос):
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<?php// Здесь нужно сделать все проверки передаваемых файлов и вывести ошибки если нужно// Переменная ответа$data = array();if( isset( $_GET['uploadfiles'] ) ){ $error = false; $files = array(); $uploaddir = './uploads/'; // . - текущая папка где находится submit.php // Создадим папку если её нет if( ! is_dir( $uploaddir ) ) mkdir( $uploaddir, 0777 ); // переместим файлы из временной директории в указанную foreach( $_FILES as $file ){ if( move_uploaded_file( $file['tmp_name'], $uploaddir . basename($file['name']) ) ){ $files[] = realpath( $uploaddir . $file['name'] ); } else{ $error = true; } } $data = $error ? array('error' => 'Ошибка загрузки файлов.') : array('files' => $files ); echo json_encode( $data );} |
Не используйте этот код напрямую! Пишите свой!
Вот и все.
Заключение
Эта статья только обучает технологии загрузки файлов с помощью AJAX. В действительности, вам нужно проверить форматы принимаемых файлов, их размер и уведомить пользователей, что произошла загрузка файла.
Чтобы не собирать весь вышеописанный код вручную, скачайте вот этот архив: ajax-file-upload.zip. Загрузите его содержимое на ваш php сервер, зайдите в паку из архива, и попробуйте загрузить файл. Вы увидите, как все это работает, сможете «пошаманить» над кодом и разобраться подробнее в реальных условиях…
Статья взята с сайта: https://wpcafe.org
