joraxr
Новичок
Вопрос сложный, конкретно меня глюконуло на одном из этапов создания, хочу понять где именно
Делаю класс вычисления нахождения файлов или папки
В классе есть такие понятия:
$this->id - номер файла или папки, попустим id из базы данных для которого нужно построить дерево и найти местоположение файла
$this->max_file_count - максимальное число файлов в папке или папок в папке
$this->branches - количество ветвлений + 1 ветвление
$this->upload_dir - стартовая директория
Суть такова, отправив в формулу номер файла $this->id я получу его местонахождения
так же я всегда могу вычислить максимальный обьем файлов который поместится в дереве папок, и считается он по формуле
$this->max_file_count в степени $this->branches+1
таким образом если я задам вот такую формулу
$this->max_file_count=3;
$this->branches=2;
то максимальный возможный обьем файлов который можно распихать по дереву будет 27
вот нарисовал картинку как это должно выглядеть
На картинке показано только 2 ветки, из может быть сколько угодно
Когда я запустил свой код, то понял что все работает, но не так как я планировал
теперь дерево выглядит вот так
Как видите, все последующие ветки нумеруются от 1 до максимально возможного числа
Что я не учел в коде, чтобы он стал работать как на первой картинке?
Вот сам класс
Вот как его запускать
создаст дерево и выведет адрес до файла
этот адрес можно потом использовать для сохранения или для чтения
Делаю класс вычисления нахождения файлов или папки
В классе есть такие понятия:
$this->id - номер файла или папки, попустим id из базы данных для которого нужно построить дерево и найти местоположение файла
$this->max_file_count - максимальное число файлов в папке или папок в папке
$this->branches - количество ветвлений + 1 ветвление
$this->upload_dir - стартовая директория
Суть такова, отправив в формулу номер файла $this->id я получу его местонахождения
так же я всегда могу вычислить максимальный обьем файлов который поместится в дереве папок, и считается он по формуле
$this->max_file_count в степени $this->branches+1
таким образом если я задам вот такую формулу
$this->max_file_count=3;
$this->branches=2;
то максимальный возможный обьем файлов который можно распихать по дереву будет 27
вот нарисовал картинку как это должно выглядеть

На картинке показано только 2 ветки, из может быть сколько угодно
Когда я запустил свой код, то понял что все работает, но не так как я планировал
теперь дерево выглядит вот так

Как видите, все последующие ветки нумеруются от 1 до максимально возможного числа
Что я не учел в коде, чтобы он стал работать как на первой картинке?
Вот сам класс
PHP:
class Upload {
public $id;
private $upload_dir;
private $max_file_count;
private $branches;
public function __construct(array $param=array()) {
$def_param=array('upload_dir'=>Q_PATH.'/uploads/','max_file_count'=>1000,'branches'=>2,'pattern'=>'');
$upload_param=Functions::arr_union($def_param,$param);//слияние массивов в один
$this->upload_dir=$upload_param['upload_dir'];
$this->max_file_count=$upload_param['max_file_count'];
$this->branches=$upload_param['branches'];
//сложность надумана, все зависит от инодов df -i и tune2fs -l /dev/hda1 и df -Ti
switch($upload_param['pattern']) {
case 'bigint':
$this->max_file_count=512;
$this->branches=6;
break;
case 'int':
$this->max_file_count=216;
$this->branches=3;
break;
case 'mediumint':
$this->max_file_count=204;
$this->branches=2;
break;
case 'smallint':
$this->max_file_count=182;
$this->branches=1;
break;
}
$this->del_id();
}
public function set_id($id) {
$this->id=$id;
}
public function del_id() {
$this->id=0;
}
public function find_upload($url) {
if(is_file($url)) {
return true;
}
else {
return false;
}
}
public function get_upload($id,$fl) {
$this->set_id($id);
for($i=$this->branches;$i>=1;$i--) {
$dir_file_arr[]=ceil($this->id/pow($this->max_file_count,$i));
}
$dir_file_str=implode("/", $dir_file_arr);
return $this->upload_dir.$dir_file_str.'/'.$this->id.$fl;
}
public function put_upload($id,$fl,$data) {
$this->set_id($id);
for($i=$this->branches;$i>=1;$i--) {
$dir_file_arr[]=ceil($this->id/pow($this->max_file_count,$i));
$dir_file_str=implode("/", $dir_file_arr);
if(!is_dir($this->upload_dir.$dir_file_str)) {
mkdir($this->upload_dir.$dir_file_str, 0777);
chmod($this->upload_dir.$dir_file_str, 0777);
}
}
file_put_contents($this->upload_dir.$dir_file_str.'/'.$this->id.$fl, $data);
return $this->upload_dir.$dir_file_str.'/'.$this->id.$fl;
}
public function set_upload($id,$fl) {
$this->set_id($id);
for($i=$this->branches;$i>=1;$i--) {
$dir_file_arr[]=ceil($this->id/pow($this->max_file_count,$i));
$dir_file_str=implode("/", $dir_file_arr);
if(!is_dir($this->upload_dir.$dir_file_str)) {
mkdir($this->upload_dir.$dir_file_str, 0777);
chmod($this->upload_dir.$dir_file_str, 0777);
}
}
return $this->upload_dir.$dir_file_str.'/'.$this->id.$fl;
}
public function get_upload_dir($id) {
$this->set_id($id);
for($i=$this->branches;$i>=1;$i--) {
$dir_file_arr[]=ceil($this->id/pow($this->max_file_count,$i));
}
$dir_file_str=implode("/", $dir_file_arr);
return $this->upload_dir.$dir_file_str.'/'.$this->id;
}
public function set_upload_dir($id) {
$this->set_id($id);
for($i=$this->branches;$i>=1;$i--) {
$dir_file_arr[]=ceil($this->id/pow($this->max_file_count,$i));
$dir_file_str=implode("/", $dir_file_arr);
if(!is_dir($this->upload_dir.$dir_file_str)) {
mkdir($this->upload_dir.$dir_file_str, 0777);
chmod($this->upload_dir.$dir_file_str, 0777);
}
}
if(!is_dir($this->upload_dir.$dir_file_str.'/'.$this->id)) {
mkdir($this->upload_dir.$dir_file_str.'/'.$this->id, 0777);
chmod($this->upload_dir.$dir_file_str.'/'.$this->id, 0777);
}
return $this->upload_dir.$dir_file_str.'/'.$this->id;
}
}
Вот как его запускать
PHP:
$upload = new Upload(array('upload_dir'=>'/uploads/','max_file_count'=>1000,'branches'=>2));
$file = $upload->set_upload(500,'_img.png');
echo $file;
этот адрес можно потом использовать для сохранения или для чтения
Последнее редактирование: