Предисловие


Раньше я об этом не задумывался и пользовался готовым решением типа от Drupal для отдачи файлов и более мне не надо было. Пока несколько месяцев назад у меня не возникла острая необходимость не только отдавать файлы.

В интернете есть много информации о том как скачивать файлы с сервера и загружать файлы на сервер, а также между серверами. Но нигде нет простого решения которое было бы более ли менее универсально.


Я несколько дней убил на изучение всяких заголовков и вариаций использования cUrl, но собрать все воедино не выходило. Видел много разных подобных классов, но везде было либо частичное решение, либо очень запутанно, либо и то, и другое.


И лишь благодаря единичным статьям, кусочкам информации с форумов и всяким комментариям удалось собрать пазл воедино. Я не утверждаю что мое решение полностью универсально, но очень удобное во многих случаях, хотя это вам решать.


Если у кого-либо возникнет желание улучшить мое решение этого вопроса и хватает знаний в этом направлении, то я буду рад, если вы сделаете какие-либо исправления или добавления к коду который лежит в открытом доступе на GitHub.


А теперь к делу, функции класса CargaDes:


  1. Отдача файла без показа его места хранения и с возможностью докачки;
  2. Загрузка файла на сервер с индикатором прогресса;
  3. Скачивание файлов с удаленного сервера на свой сервер с индикатором прогресса;
  4. Загрузка файлов со своего сервера на удаленный сервер с индикатором прогресса.

Для начала нужно скачать и подключить класс CargaDes:


include cargades.class.php

1. Отдача файла без показа его места хранения с возможностью докачки и регулирования скорости


$realFilePath = dirname( __FILE__ ) . '/file.zip';//Полный путь к отдаваемому файлу

Этот метод очень похож на Drupal и иже с ним:


$speed = 25;// это скорость отдачи в kB, если 0 то не используется;
$apache = false;//это тип отдачи, в данном случае средствами PHP с докачкой;

new CargaDes( $realFilePath, $apache, $speed );

Я добавил еще отдачу с помощью Apache, но должна быть включена директива XSendFile On


$apache = true;//это тип отдачи средствами Apache(работает он с докачкой или нет я пока так и не понял)
new CargaDes( $realFilePath, true );

Сразу после объявления класса браузер выдаст окно для сохранения файла


2. Загрузка файла или файлов на сервер с индикатором прогресса


//основные данные
$url_server = "http://ваш_сайт.com/upload.php";//Путь к принимающему скрипту на сервере.

//Не обязательные параметры, если не заданы значения, то используются значения по умолчанию
$multiple = 0;//True множественная загрузка файлов, False загрузка по одному файлу

CargaDes::$param = 0;//Добавление данных в форму массивом в переменную param - сервер получит param=>array(ваш массив)
CargaDes::$ajaxParam = '';//Добавление данных в форму - data.append("key", "val");
CargaDes::$return = '';//Добавление действий после выполнения ajax
CargaDes::$err_file_zero = 0;//Текст ошибки о пустом файле
CargaDes::$allowed_ext = 'gif,jpg,png,jpe,jpeg,zip,rar,exe,doc,pdf,swf,flv,avi,mp4,mp3';//Разрешенные расширения файлов
CargaDes::$err_file_ext = 0;//Текст ошибки об отсутствии расширения в списке
CargaDes::$max_file_size = 0;//Ограничение на размер загружаемых файлов в байтах, по умолчанию отключено
CargaDes::$err_file_size = 0;//Текст ошибки о превышении установленного размера файла
CargaDes::$max_file_count = 0;//Ограничение на количество загружаемых файлов, по умолчанию отключено
CargaDes::$btn_input = 0;//Имя кнопки выбора файлов
CargaDes::$btn_enviar = 0;//Имя кнопки отправки файлов
CargaDes::$btn_del = 0;//Имя кнопки удаления файлов из очереди
CargaDes::$color = 0;//Цвет линии прогресса загрузки
CargaDes::$css = 0;//Путь к файлу стилей

echo CargaDes::_clientU($url_server, $multiple);

После выполнения метода появится кнопка для выбора файлов и кнопка для загрузки файлов. Индикатор будет появляться для каждого выбранного файла в отдельности.



3. Скачивание файлов с удаленного сервера на свой сервер


$style='/style.cargades.css';//Имя и путь файла стилей или False - файл стилей нужно грузить отдельно 
$idp = ‘’;//Префикс класса индикатора
$color='4098D3';// Цвет линии прогресса загрузки

echo CargaDes::_serverProgress();//Вывод индикатора

$remoteUrl = 'http://сайт.com/file.zip';//URL файла на удаленном сервере
$realFilePath = dirname( __FILE__ );//Путь куда хотим положить файл

CargaDes::$progress - Подключение индикатора
CargaDes::$login - Логин отправляемый на сервер, если есть авторизация типа .htaccess
CargaDes::$pass - Пароль отправляемый на сервер, если есть авторизация типа .htaccess
CargaDes::$speedU - Ограничение скорости

$result = CargaDes::_serverD($remoteUrl, $realFilePath);
if( $result != false ) {die('Error:'. $result);}//Сообщение в случае ошибки

4. Загрузка файлов со своего сервера на удаленный сервер


$style='/style.cargades.css';//Имя и путь файла стилей или False - файл стилей нужно грузить отдельно 
$idp = ‘’;//Префикс класса индикатора
$color='4098D3';// Цвет линии прогресса загрузки

echo CargaDes::_serverProgress();//Вывод индикатора

$remoteUrl - Путь к удаленному серверу.
fileU - Массив для POST отправки.

CargaDes::$progress - Подключение индикатора
CargaDes::$login - Логин отправляемый на сервер, если есть авторизация типа .htaccess
CargaDes::$pass - Пароль отправляемый на сервер, если есть авторизация типа .htaccess
CargaDes::$speedU - Ограничение скорости

$post_files = dirname( __FILE__ ) . file.zip;//Можно использовать массив файлов
$post = array( 'login' => 'test', 'pass' => '12345' );//Любые значения которые вы хотите передать на сервер
$fileU = CargaDes::_serverFiles($post_files, $post);

if( !$fileU ) {die('Error array');}

$result = CargaDes::_serverU($remoteUrl,$fileU);
if( $result != false ) {die('Error:'. $result);}

По итогу хочу сказать


Если этот класс поможет хотя бы одному человеку я буду очень рад этому. Как я уже говорил в начале буду рад конструктивной критике и дополнениям которые могут привести к улучшению класса. Ссылка на CargaDes.class.