Как и просили, выкладываю способ для копирования файлов на хостинг. Способ простой, так что можете дополнять его своими фишками.
Начнем))
Шаг 1. Основной файл
<?php
include_once 'f.php'; // подключаем файл с функциями xss, fxss, size
include_once 'form.php'; // подключаем файл с классом формы
include_once 'load.php'; // подключаем файл с классом копирования файлов
define('FILE_SIZE',1024*1024*1024); // максимальный размер файла в байтах
define('FILE_MAX',10); // максимальное кол-во файлов для загрузки
$format=array('gif','jpg','png','zip'); // разрешенные форматы для загрузки
$dir='dir'; // папка для копирования файлов
#############
if(!empty($_POST)){ // если передано кол-во файлов для загрузки, то задаем значения в переменные
$upload=intval($_POST['upload']);
$import=intval($_POST['import']);
if($upload>FILE_MAX){$upload=$_POST['upload']=FILE_MAX;} //если значения выше максимального, то устанавливаем максимально допустимое значение
if($import>FILE_MAX){$import=$_POST['import']=FILE_MAX;}
}else{$upload=$import=0;}
#############
if(isset($_POST['submit']) and ($upload or $import)){ // проверяем, нажата ли кнопка для отправки файлов
$file=new LOAD($format,FILE_SIZE,FILE_MAX); // создаем класс для проверки и загрузки файлов, и передаем параметры в конструктор
if($upload){ // если переданы файлы аплоада, то делаем их проверку
$file->check($_FILES['upload_file']['tmp_name'], $_FILES['upload_file']['name']);
}
if($import){ // тоже самое и для импорта
$file->check($_POST['import_file'], $_POST['import_file']);
}
if($file->error){ // если есть ошибки, то выводим их
echo $file->error();
}else{ // иначе делаем копирование в папку
$file->copy($dir);
echo 'Файлы успешно скопированы!';
}
unset($file); // удаляем объект, так, на всякий случай, чтобы не мешался
}
#############
$form=new FORM('index.php','post',true); // создаем форму
$form->input('upload', $_POST, array('Прикрепить:',' файлов<hr />')); // инпут для ввода кол-ва файлов для аплоада
if($upload){ // если передано кол-во файлов для аплоада, то выводим соответствующие инпуты
$form->input('upload_file','',array('Файлы для аплоада:<br/>','<hr />'),$upload,'file');
}
$form->input('import', $_POST, array('Импортировать:',' файлов<hr />')); // инпут для ввода кол-ва файлов для импорта
if($import){ // тоже самое и для аплоада
$form->input('import_file',$_POST,array('Файлы для импорта:<br/>','<hr />'),$import);
}
$form->submit('file','Прикрепить/импортировать'); // кнопка для отправки только кол-ва файлов для загрузки
if($upload or $import){ // если передано кол-во файлов для загрузки, то выводим кнопку для отправки их на проверку
$form->submit('submit','Отправить файлы','<br/>');
}
unset($form); // обязательно закрываем форму(этим самым мы вызываем деструктор и печатаем форму)
Шаг 2. Класс формы
<?php
class FORM{ // создаем класс для формы
private $print=array(); // создаем внутреннюю переменную, в которой будет храниться форма(удобно для форматирования формы)
##############
public function __construct($action,$method='post',$file=false){ // конструктор класса. тут все вроде понятно
$file=$file ? ' enctype="multipart/form-data"' : '';
$this->print[]='<form action="'.$action.'" method="'.$method.'"'.$file.'>';
}
##############
public function __destruct(){ // деструктор - вывод на экран
$this->print[]='</form>';
echo implode("\n",$this->print);
}
##############
public function input($name,$param,$text,$count=false,$type='text'){ // метод для создания тега формы input
/*
$name - имя для тега
$param - массив для подстановки значений после отправки формы
$text - текст по бокам от тега
$count - флаг, который говорит о том, что нужно сделать тег массивным
$type - тип тега, по умолчанию text
*/
if($text[0]){$this->print[]=$text[0].'<br/>';} // заносим во внутреннюю переменную текст, который должен выводится до тега
if($count!==false){ // если передано число, то добавляем к имени квадратные скобки. Это значит, что тег передаст массив с данными
$f_name=$name.'[]';
}else{ // иначе
$count=1; // присваиваем 1 к переменной, она же число циклов
$f_name=$name; // оставляем имя для тега как есть
}
for($i=0;$i<$count;$i++){ // запускаем цикл
if(!empty($param[$name][$i])){ // если передан параметр
$v=xss($param[$name][$i]); // фильтруем его и подставляем в значение формы
}else{ // иначе задаем пустую переменную
$v='';
}
$this->print[]='<input type="'.$type.'" name="'.$f_name.'" value="'.$v.'" /><br/>'; // заносим во внутреннюю переменную сам тег
}
$this->print[]=$text[1]; // заносим во внутреннюю переменную текст, который должен выводится после тега
}
##############
public function submit($name,$value,$text=false){ // аналогично и с кнопкой
$this->print[]=$text.'<input type="submit" name="'.$name.'" value="'.$value.'" />';
}
##############
}
Шаг 3. Класс проверки и загрузки файлов
<?php
class LOAD{ // создаем класс для загрузки файлов
public $error=array(); // задаем внутренний массив для ошибок
public $copy=array(); // массив, в котором будут содержаться данные о копируемых файлах(при желании, после копирования из него можно вытащить информацию о скопированных файлах)
private $format=array(); // разрешенные форматы файлов
private $format_i; // строка с разрешенными форматами
private $size; // максимальный размер файлов
private $max; // максимальное кол-во файлов
private $sf=0; //счетчик файлов
##############
public function __construct($format,$size,$max){ // заносим переданные параметры во внутренние переменные
$this->format=$format;
$this->format_i=implode(', ',$format);
$this->size=$size;
$this->max=$max;
}
##############
//public function __destruct(){
//}
##############
public function check($file,$name){ // основной метод проверки файлов
if(!is_array($file)){ // если передан не массив(к примеру 1 файл), то
$file=array($file); // создаем массив и путями файлов
$name=array($name); // и их именами
}
$this->sf+=sizeof($file); // счетчик файлов
if($this->sf>$this->max){ // если счетчик превысил допустимое кол-во файлов, то обнуляем счетчик и создаем массив с ошибкой
$sf=0;
$this->error=array('Неверное кол-во переданных файлов!');
}else{$sf=$this->sf;} // иначе заносим в обычную переменную кол-во переданных файлов
$load=file_exists($file[0]); // проверяем, существует ли файл на хостинга. если нет, значит файл импортируемый
if($load){$tip='аплоад';}else{$tip='импорт';} // помещаем тип в файлов в переменную, которая будет вставляться в сообщения с ошибками
for($i=0;$i<$sf;$i++){ // запускаем цикл проверки
if(empty($file[$i])){continue;} // если ячейка массива пуста, то пропускаем этот цикл
$error=array(); // создаем массив, в который будем заносить ошибки, касающиеся файла из текущей ячейки
if(!empty($name[$i])){ // если ячейка с именем файла не пуста, то
$f=$name[$i]; // заносим в переменную имя файла
}else{ // иначе
$f=$file[$i]; // заносим в переменную в качестве имени путь файла
}
$s=$this->size($file[$i],$load); // проверяем размер
$f=$this->format($f,$load); // проверяем формат
if(!in_array($f,$this->format)){ // если формат файла не содержится в массиве с разрешенными форматами, то
$error[]='Неверный формат файла #'.($i+1).'('.$tip.'), разрешены только '.$this->format_i.'!'; // добавляем сообщение об ошибке
}
if($s<10 or $s>$this->size){ // если размер файла меньше 10 байт или больше максимально допустимог, то
$error[]='Неверный размер файла #'.($i+1).'('.$tip.'), мин. '.size(10).', макс. '.size($this->size).'!'; // добавляем сообщение об ошибке
}
if(!empty($error)){ // если есть ошибки
$this->error[]=implode('<br/>',$error); // то заносим из в переменную класса
}else{ // иначе
$name=strtok(basename($name[$i]),'.');
$this->copy[]=array($file[$i],$f,$s,$name); // добавляем в массив для копирования файлов информацию о файле
/*
$file[$i] - путь к файлу
$f - формат
$s - размер
$name - имя файла
*/
}
}
}
##############
private function format($file,$tip){ // метод извлечения формата файла
$file=trim(str_replace("\0",'_',$file)); // удаляем нулевой байт, хотя на последних версиях пыха, это не требуется
if($tip){ // если файл на хостинге, то
$file=pathinfo($file,PATHINFO_EXTENSION); // вытаскиваем формат
}else{ // иначе он импортируемый
$file=explode('.',strtok($file,'?')); // обрезаем все, после знака вопроса и разбиваем оставшуюся строку на массив точкой
$file=array_pop($file); // вынимаем последний элемент массив, он же - формат файла
}
return strtolower(preg_replace('#[^a-z0-9]#i','',$file)); // вырезаем все, кроме англ. букв и цифр, изменяем регистр букв на нижний
}
##############
private function size($file,$tip){ // метод извлечения размера файла
if($tip){ // если файл на хостинге, то
$size=filesize($file); // вытаскиваем размер
}else{ // иначе
$size=get_headers($file,1); // получаем заголовки с удаленного сервера
if(!isset($size['Content-Length'])){ // если нужный нам заголовок не передан, то
$size=0; // выставляем размер файла - 0
}else{ // иначе
$size=intval($size['Content-Length']); // получаем его из заголовка
}
}
return $size;
}
##############
public function error(){ // метод выдачи ошибок
if(!empty($this->error)){ // если есть ошибки, то
$e=$this->error; // заносим их в обычную переменную
$this->error=array(); // а массив класса очищаем
return implode('<br/>',$e); // возвращаем строку с ошибками
}
}
##############
public function copy($dir){ // и сам метод копирования файлов
for($i=0,$sf=sizeof($this->copy);$i<$sf;$i++){ // запускаем цикл
$file=$dir.'/'.$i.'.'.$this->copy[$i][1]; // получаем пусть копируемого файла
/*
ВНИМАНИЕ! Вместо $i в пути файла лучше подставить элемент 2 массива(сдержищий уникальный ключ для пути файла, например id записи из базы), который можно передать методу, иначе при каждой загрузке файлы будут перезаписываться
*/
if(file_exists($file)){unlink($file);} // если файл существует, то удаляем его
copy($this->copy[$i][0],$file); // копируем файл
}
}
##############
}
Как видите, в этом нет ничего сложного))