Предисловие
Раньше я об этом не задумывался и пользовался готовым решением типа от Drupal для отдачи файлов и более мне не надо было. Пока несколько месяцев назад у меня не возникла острая необходимость не только отдавать файлы.
В интернете есть много информации о том как скачивать файлы с сервера и загружать файлы на сервер, а также между серверами. Но нигде нет простого решения которое было бы более ли менее универсально.
Я несколько дней убил на изучение всяких заголовков и вариаций использования cUrl, но собрать все воедино не выходило. Видел много разных подобных классов, но везде было либо частичное решение, либо очень запутанно, либо и то, и другое.
И лишь благодаря единичным статьям, кусочкам информации с форумов и всяким комментариям удалось собрать пазл воедино. Я не утверждаю что мое решение полностью универсально, но очень удобное во многих случаях, хотя это вам решать.
Если у кого-либо возникнет желание улучшить мое решение этого вопроса и хватает знаний в этом направлении, то я буду рад, если вы сделаете какие-либо исправления или добавления к коду который лежит в открытом доступе на GitHub.
А теперь к делу, функции класса CargaDes:
- Отдача файла без показа его места хранения и с возможностью докачки;
- Загрузка файла на сервер с индикатором прогресса;
- Скачивание файлов с удаленного сервера на свой сервер с индикатором прогресса;
- Загрузка файлов со своего сервера на удаленный сервер с индикатором прогресса.
Для начала нужно скачать и подключить класс 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.
vdem
Не поможет.
1. Для начала изучите PSR, ну или хотя бы выработайте свой оригинальный стиль написания кода (то у вас у операции сравнения или присваивания есть слева и справа пробелы, то нет, ну и т.д.). Это не придирка: код, написанный без какого-либо следования соглашениям трудней понимать.
2. Давайте переменным, аргументам и функциям/методам понятные имена. Что означает «U» в названии метода "_serverU()"? Зачем там знак подчеркивания (в PHP4 так, как правило, обозначали приватные методы — если не ошибаюсь).
3.
Почему бы не вынести список mime-типов в конфигурацию? Или предлагаете каждый раз править Ваши исходники чтобы внести в него изменения?UPD: не совсем разобрался сначала, зачем оно там.4. Класс привязан к jQuery, а это уже давно не 100% необходимая библиотека.
Ну и много чего еще. Я про саму реализацию даже писать ничего не хочу, криво слеплено.
P.S. Следовало бы еще вычитать статью как следует перед публикацией — куча ошибок.
Borivit Автор
Ну не поможет так не поможет, я не настаиваю.
1. Пробелы после сравнения у меня только если запись в одну строчку, а в случае присваивания так там в коде все с пробелами, а в условиях, кавычках и js без пробелов хотя кое-где не доглядел, но мне кажется что это не критично;
2. U значит upload, а подчеркивание для выделения;
4. На счет Query согласен, но это можно будет допилить;
Если не секрет вы про какую именно кучу ошибок?