PHP class для скачки и закачки файлов на сервер

от автора

Предисловие

Раньше я об этом не задумывался и пользовался готовым решением типа от 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.

ссылка на оригинал статьи https://habr.com/ru/post/484492/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *