-
Notifications
You must be signed in to change notification settings - Fork 0
/
ftp_wanderer.php
141 lines (119 loc) · 4.22 KB
/
ftp_wanderer.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
<?php
/*
* Напишете пакет для Composer, который будет заниматься тем, что с удаленного хоста загружать картинки и сохранять их на ФС.
*/
/**
* Это определение класса,предоставляющего доступ к удаленному хосту ftp
*/
class ftp_Wanderer {
private $conn_id;
private $is_login;
protected $host;
protected $port;
protected $timeout;
protected $login;
protected $password;
public function __construct($host, $port = 21, $timeout = 90)
{
$this->host = $host;
$this->port = $port;
$this->timeout = $timeout;
}
public function __destruct()
{
if( isset($this->conn_id) )
ftp_close($conn_id);
}
//устанавливаем соединение
protected function Opened()
{
$this->conn_id = ftp_connect($this->host, $this->port, $this->timeout);
if ($this->conn_id === false)
throw Exception("Не удалось установить соединение с ".$this->host);
return $this->conn_id;
}
// получаем соединение
final public function GetConnection()
{
if( isset($this->conn_id) )
return $this->conn_id;
else
return $this->Opened();
}
// работа с параметрами подключения
public function Set_option($option, $value)
{
return ftp_set_option($this->GetConnection(), $option, $value);
}
public function Get_option($option)
{
return ftp_get_option($this->GetConnection(), $option);
}
// подключение к серверу
protected function Login($login, $password)
{
if ($this->is_login)
if ( ($this->login == $login) && ($this->password == $password) )
return true;
$this->login == $login;
$this->password == $password;
return ($this->is_login = ftp_login($this->GetConnection(), $this->login, $this->password));
}
}
/**
* Class для перекачки картинок с удаленного сервера на свой ФС
*/
class ftp_ImagesDownloader extends ftp_Wanderer {
const img_types = 'jpg;png;gif';
private $path;
private $mask;
private $tmpfileName;
public function __construct($host, $port = 21, $timeout = 90)
{
parent::__construct($host, $port, $timeout);
}
public function __destruct()
{
if(isset($this->tmpfileName))
unlink($this->tmpfileName);
parent::__destruct();
}
// создаем временный файл
private function CreateTmpFile()
{
if( ($this->tmpfileName = tempnam(sys_get_temp_dir(), "tmp")) === false)
throw Exception("Не удалось создать временный файл для приема данных.");
return $this->tmpfileName;
}
private function GetTmpFileName()
{
return $this->tmpfileName;
}
private function GetImageFromURL($url)
{
file_put_contents($this->GetTmpFileName(), file_get_contents($url));
}
private function GetImageFromPHP($path)
{
$ch = curl_init($path);
$fp = fopen( $this->GetTmpFileName(), 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);
}
public function Download($login, $password, $path, $mask)
{
if ( !($this->login($login, $password)) )
throw Exception("Не удалось подключиться к {$this->host} с логином $login");
CreateTmpFile();
if ( preg_match( '/\.php$/', $path) )
GetImageFromPHP($path);
elseif( preg_match('/\.[' + $this::img_types + ']$/', $path) )
GetImageFromURL($path);
else
throw Exception("Непонятный формат данных.");
return ( ftp_put($this->GetConnection(), '', $this->GetTmpFileName(), FTP_BINARY) );
}
}