Заморочился сделать файлообменник с хранением файлов на так называемом «облаке».
Сейчас достаточно много бесплатных облачных хранилищ, например Mail.ru предлагает аж 100 гигабайт (!) места.
Яндекс.Диск дает на порядок меньше места – 10 гигабайт (хотя у меня на компе их же прога покапоказывает 212 Гб. О_о). Но у яндекса все функции хорошо документированы, поэтому будем работать с ним, тем боле, что я давно пользуюсь эти облаком для хранения бекапов и прочих разных полезных файлов.
Поиск в сети не дал подходящих под мою задумку результатов, поэтому решил написать свой вариант. Получился вот такой простой класс, который реализует основные методы работы с Яндекс Диском и при желании может быть легко расширен.
- <?
- class yandex_disk {
- var $ch;
- var $ansver,$info;
- var $headers=array();
- function __construct($user,$pass)
- {
- $this->headers[] = "Authorization: Basic " . base64_encode($user . ":" . $pass);
- $this->ch = curl_init ();
- curl_setopt ($this->ch , CURLOPT_USERAGENT , "MicroWap Agent v0.1 beta (c) Temp (http://microwap.ru)");
- curl_setopt ($this->ch, CURLOPT_HEADER , 0);
- curl_setopt ($this->ch, CURLOPT_RETURNTRANSFER , 1 );
- curl_setopt ($this->ch, CURLOPT_BINARYTRANSFER , 1);
- curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, false);
- }
- //-----------------//
- function my_exec()
- {
- curl_setopt($this->ch, CURLOPT_HTTPHEADER, $this->headers);
- $this->ansver = curl_exec($this->ch);
- $this->info = curl_getinfo($this->ch);
- curl_close($this->ch);
- }
- //--------получить файл---------//
- function get($url)
- {
- curl_setopt ($this->ch, CURLOPT_URL , 'https://webdav.yandex.ru'.$url);
- $this->my_exec();
- if ($this->info['http_code'] != '200') return FALSE; // Error!
- return $this->ansver;
- }
- //--------удалить файл---------//
- function delete($url)
- {
- curl_setopt ($this->ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
- curl_setopt ($this->ch, CURLOPT_URL , 'https://webdav.yandex.ru'.$url);
- $this->my_exec();
- if ($this->info['http_code'] != '204') return FALSE; // Error!
- return TRUE;
- }
- //-------закачать файл----------//
- function put($file,$url)
- {
- curl_setopt ($this->ch, CURLOPT_CUSTOMREQUEST, 'PUT');
- curl_setopt ($this->ch, CURLOPT_URL , 'https://webdav.yandex.ru'.$url);
- curl_setopt ($this->ch, CURLOPT_POSTFIELDS, file_get_contents($file));
- $this->my_exec();
- if ($this->info['http_code'] != '201') return FALSE; // Error!
- return TRUE;
- }
- //-------Список файлов в директории----------//
- function ls($dir = '')
- {
- $this->headers[] ='Depth: 1';
- curl_setopt ($this->ch, CURLOPT_CUSTOMREQUEST, 'PROPFIND');
- curl_setopt ($this->ch, CURLOPT_URL , 'https://webdav.yandex.ru'.$dir);
- $this->my_exec();
- if ($this->info['http_code'] != '207') return FALSE; // Error!
- $xml = simplexml_load_string($this->ansver);
- $xml->registerXPathNamespace('d','urn:DAV');
- $res=array();
- foreach ($xml->xpath('/d:multistatus/d:response/d:href') as $v)
- {
- $res[] = urldecode($v);
- }
- return $res;
- }
- //-----------------//
- function mkdir($dir)
- {
- curl_setopt ($this->ch, CURLOPT_CUSTOMREQUEST, 'MKCOL');
- curl_setopt ($this->ch, CURLOPT_URL , 'https://webdav.yandex.ru'.$dir);
- $this->my_exec();
- if ($this->info['http_code'] != '201') return FALSE; // Error!
- return TRUE;
- }
- //-----------------//
- }
- ?>
- <?
- //------------------------------//
- function debug($arg)
- {
- echo '<pre>'.print_r($arg,true).'</pre>';
- }
- //------------------------------//
- include ('yandex.disk.php');
- $login = "login"; //логин (можно и без @yandex.ru)
- $password = "pass"; // и пароль соответственно
- $disk = new yandex_disk($login , $password);
- // за один раз можно вызвать только один метод, то есть если вы все тут раз комментируете сработает только первый метод
- // получить список файлов в указанной директории
- if ($ls = $disk->ls('/')) {echo '<P>OK</P>'; debug($ls);} else {echo '<P><font color="red">ERROR</font></P>'; echo $disk->ansver; }
- // создать папку
- //if ($disk->mkdir('/dir')) echo '<P>OK</P>'; else echo '<P><font color="red">ERROR</font></P>';
- // закачать файл в хранилище
- //if ($disk->put('test.zip','/dir/test.zip')) echo '<P>OK</P>'; else echo '<P><font color="red">ERROR</font></P>';
- // скачать файл из хранилища
- //if ($data = $disk->get('/dir/test.zip')) {echo '<P>OK</P>'; file_put_contents('~test.zip',$data);} else echo '<P><font color="red">ERROR</font></P>';
- // удалить файл или папку
- //if ($disk->delete('/dir/test.zip')) echo '<P>OK</P>'; else echo '<P><font color="red">ERROR</font></P>';
- //d($disk->info); // вернувшиеся заголовки
- //echo $disk->ansver; // ответ сервера
- ?>