Вниз  Класс для работы с Яндекс Диском
- 8.08.2014 / 15:36
Microwap
  Пользователь

Microwap 
Сейчас: Offline
Оригинал статьи, там можно скачать исходники ТЫЦ


Заморочился сделать файлообменник с хранением файлов на так называемом «облаке».
Сейчас достаточно много бесплатных облачных хранилищ, например Mail.ru предлагает аж 100 гигабайт (!) места.
Яндекс.Диск дает на порядок меньше места – 10 гигабайт (хотя у меня на компе их же прога покапоказывает 212 Гб. О_о). Но у яндекса все функции хорошо документированы, поэтому будем работать с ним, тем боле, что я давно пользуюсь эти облаком для хранения бекапов и прочих разных полезных файлов.

Поиск в сети не дал подходящих под мою задумку результатов, поэтому решил написать свой вариант. Получился вот такой простой класс, который реализует основные методы работы с Яндекс Диском и при желании может быть легко расширен.
  1. <?
  2.  
  3. class yandex_disk {
  4.  
  5. var $ch;
  6. var $ansver,$info;
  7. var $headers=array();
  8.  
  9. function __construct($user,$pass)
  10.  {  
  11.  $this->headers[] = "Authorization: Basic " . base64_encode($user . ":" . $pass);
  12.  
  13.  $this->ch = curl_init ();
  14.  curl_setopt ($this->ch , CURLOPT_USERAGENT , "MicroWap Agent v0.1 beta (c) Temp (http://microwap.ru)");
  15.  
  16.  curl_setopt ($this->ch, CURLOPT_HEADER , 0);
  17.  curl_setopt ($this->ch, CURLOPT_RETURNTRANSFER , 1 );
  18.  curl_setopt ($this->ch, CURLOPT_BINARYTRANSFER , 1);
  19.  curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, false);
  20.  curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, false);
  21.  }
  22.  
  23. //-----------------//
  24. function my_exec()
  25.  {
  26.  curl_setopt($this->ch, CURLOPT_HTTPHEADER, $this->headers);
  27.  $this->ansver = curl_exec($this->ch);
  28.  $this->info = curl_getinfo($this->ch);
  29.  curl_close($this->ch);
  30.  }
  31.  
  32. //--------получить файл---------//
  33. function get($url)  
  34.  {
  35.  curl_setopt ($this->ch, CURLOPT_URL , 'https://webdav.yandex.ru'.$url);
  36.  $this->my_exec();
  37.  if ($this->info['http_code'] != '200') return FALSE; // Error!
  38.  return $this->ansver;
  39.  
  40.  }
  41. //--------удалить файл---------//
  42. function delete($url)
  43.  {
  44.  curl_setopt ($this->ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
  45.  curl_setopt ($this->ch, CURLOPT_URL , 'https://webdav.yandex.ru'.$url);
  46.  $this->my_exec();
  47.  if ($this->info['http_code'] != '204') return FALSE; // Error!
  48.  return TRUE;
  49.  }
  50. //-------закачать файл----------//
  51. function put($file,$url)
  52.  {
  53.  curl_setopt ($this->ch, CURLOPT_CUSTOMREQUEST, 'PUT');
  54.  curl_setopt ($this->ch, CURLOPT_URL , 'https://webdav.yandex.ru'.$url);
  55.  curl_setopt ($this->ch, CURLOPT_POSTFIELDS, file_get_contents($file));
  56.  
  57.  $this->my_exec();
  58.  if ($this->info['http_code'] != '201') return FALSE; // Error!
  59.  
  60.  return TRUE;
  61.  }
  62. //-------Список файлов в директории----------//
  63. function ls($dir = '')
  64.  {
  65.  $this->headers[] ='Depth: 1';
  66.  curl_setopt ($this->ch, CURLOPT_CUSTOMREQUEST, 'PROPFIND');
  67.  curl_setopt ($this->ch, CURLOPT_URL , 'https://webdav.yandex.ru'.$dir);
  68.  $this->my_exec();
  69.  
  70.  if ($this->info['http_code'] != '207') return FALSE; // Error!
  71.  
  72.  
  73.  $xml = simplexml_load_string($this->ansver);
  74.  $xml->registerXPathNamespace('d','urn:DAV');
  75.  $res=array();
  76.  
  77.  foreach ($xml->xpath('/d:multistatus/d:response/d:href') as $v)
  78.   {
  79.   $res[] = urldecode($v);  
  80.   }
  81.  
  82.  return $res;
  83.  }
  84. //-----------------//
  85. function mkdir($dir)
  86.  {
  87.  curl_setopt ($this->ch, CURLOPT_CUSTOMREQUEST, 'MKCOL');
  88.  curl_setopt ($this->ch, CURLOPT_URL , 'https://webdav.yandex.ru'.$dir);
  89.  $this->my_exec();
  90.  if ($this->info['http_code'] != '201') return FALSE; // Error!
  91.  return TRUE;
  92.  }
  93. //-----------------//
  94.  
  95.  
  96. }
  97.  
  98. ?>
Основные методы данного класса
  1. <?
  2. //------------------------------//
  3. function debug($arg)
  4.  {
  5.  echo '<pre>'.print_r($arg,true).'</pre>';
  6.  }
  7. //------------------------------//
  8.  
  9. include ('yandex.disk.php');
  10.  
  11. $login = "login"; //логин (можно и без @yandex.ru)
  12. $password = "pass"; // и пароль соответственно
  13.  
  14. $disk = new yandex_disk($login , $password);
  15.  
  16. // за один раз можно вызвать только один метод, то есть если вы все тут раз комментируете сработает только первый метод
  17.  
  18. // получить список файлов в указанной директории
  19. if ($ls = $disk->ls('/')) {echo '<P>OK</P>'; debug($ls);} else {echo '<P><font color="red">ERROR</font></P>'; echo $disk->ansver; }
  20.  
  21. // создать папку
  22. //if ($disk->mkdir('/dir')) echo '<P>OK</P>'; else echo '<P><font color="red">ERROR</font></P>';
  23.  
  24. // закачать файл в хранилище
  25. //if ($disk->put('test.zip','/dir/test.zip')) echo '<P>OK</P>'; else echo '<P><font color="red">ERROR</font></P>';
  26.  
  27. // скачать файл из хранилища
  28. //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>';
  29.  
  30. // удалить файл или папку
  31. //if ($disk->delete('/dir/test.zip')) echo '<P>OK</P>'; else echo '<P><font color="red">ERROR</font></P>';
  32.  
  33.  
  34.  
  35. //d($disk->info); // вернувшиеся заголовки
  36. //echo $disk->ansver; // ответ сервера
  37.  
  38. ?>


Изменено Microwap (8.08 / 15:37) (всего 1 раз)
- 8.08.2014 / 16:53
HoldFast
  Пользователь

HoldFast 
Сейчас: Online
Норм
__________________
 Да, детка, я - Король Ящериц!!!
- 10.08.2014 / 22:42
dimon_net
  Пользователь

dimon_net 
Сейчас: Offline
Тоже норм
- 11.08.2014 / 23:39
Koenig
  Модератор форума

Koenig 
Сейчас: Offline
var ???
__________________
 Магистр Мёда
- 11.08.2014 / 23:40
Koenig
  Модератор форума

Koenig 
Сейчас: Offline
пых 5 а ооп из пых 4 пользуешь? не кошерно же
__________________
 Магистр Мёда
- 11.08.2014 / 23:51
Koenig
  Модератор форума

Koenig 
Сейчас: Offline
Microwap, по сути можно покрасивому сделать, написать метод валидации кодов ответа, установщик заголовков можно массивом ( http://php.net/manual/ru/function.curl-setopt-array.php ) , метод run который будет запускать выполнение и проверять на ходу нужное
__________________
 Магистр Мёда

Изменено Koenig (11.08 / 23:53) (всего 1 раз)
- 12.08.2014 / 01:00
Koenig
  Модератор форума

Koenig 
Сейчас: Offline
__________________
 Магистр Мёда
- 12.08.2014 / 14:31
Microwap
  Пользователь

Microwap 
Сейчас: Offline
Красота как говорится требует жертв. Данный код написан буквально на коленке, если есть нужда переделывайте под себя. Я использовал данный алгоритм, для того чтобы можно было пользоваться яндекс диском сразу после регистрации, без лишних телодвижений. А для использования API нужно создать приложение, каждый раз получать токен и еще ХЗ что нужно в общем геморрой один.[url]http://api.yandex.ru/disk/api/concepts/quickstart.xml[/url]

А на счет того что «пых 5 а ооп из пых 4 пользуешь? не кошерно же» главное ведь работает =)
- 12.08.2014 / 15:13
Koenig
  Модератор форума

Koenig 
Сейчас: Offline
Microwap, да класс можно красивый написать и апи в нем за юзать, токен разве проблема?
__________________
 Магистр Мёда
- 12.08.2014 / 15:28
HoldFast
  Пользователь

HoldFast 
Сейчас: Online
Koenig, че ты даипалса
__________________
 Да, детка, я - Король Ящериц!!!
Наверх  Всего сообщений: 11
Фильтровать сообщения
Поиск по теме