Наш чат в Telegram для обмена идеями, проектами, мыслями, людьми в сфере ИТ г.Ростова-на-Дону: @it_rostov

Загрузка файлов на Яндекс.Диск с использованием Curl

Яндекс предлагает удобное средство для хранения данных - облачное хранилище Яндекс-диск. Для работы с хранилищем можно установить на компьютер программку, которая будет автоматически в фоновом режиме отправлять содержимое указанной папки вашего компьютера в облачное хранилище Яндекс-диска. Или вручную по мере необходимости Вы можете сохранять в облаке нужные вам файлы. Я использую Яндекс Диск вместе с DropBox для хранения резервных копий важной информации.

Регистрируясь по указанным здесь ссылкам Вы получаете дополнительный объем диска:
+500Мб на DropBox
+1Гб на Яндекс.Диске.

Для работы с Яндекс диском можно использовать WebDAV протокол. Описание WebDav-API Яндекс-диска.
Следующий пример позволяет загрузить переданный файл в облако Яндекс.Диск.

<?
$url='путь и имя на Яндекс-диске';
$file='файл для загрузки';
$user='ваш логин на яндексе';
$pass='ваш пароль на яндексе';
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_URL, 'https://webdav.yandex.ru' . $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents($file));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: Basic " . base64_encode($user . ":" . $pass)));
$answer = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
if ($info['http_code'] != '201') echo "Error!";
echo "Ok";
?>

API Яндекс-диска позволяет загружать файлы, считывать их, проверять свободное место, создавать и удалять папки, публиковать файлы и папки для публичной загрузки(общего доступа). Все эти функции реализованы в представленном ниже классе. Класс использует стандартную библиотеку PHP curl. Для разбора ответа используется функция класса xml_decode.

Описание класса работы с Яндекс-диском:

<?

/**
 * Class yd - Класс работы с яндекс-диском
 */
class yd
{

    const url = 'https://webdav.yandex.ru';
    //const url = 'https://webdav.cloud.mail.ru' //для Mail.Ru

    /** получить файл http://api.yandex.ru/disk/doc/dg/reference/get.xml
     * @param string $url путь на Яндекс-диске.
     * @return bool
     */
    function get($url){}

    /** удалить файл
     * @param string $url путь на Яндекс-диске.
     * @return bool
     */
    function delete($url){}

    /** отправить файл
     * @param string $file файл с путем для загрузки на Яндекс-диске.
     * @param string $url путь на Яндекс-диске. Если не задан, то кладу в корень с тем же именем
     * @return bool
     */
    function put($file, $url=''){}

    /** получить список файлов в директории
     * @param string $dir
     * @return array|bool
     */
    function dir($dir = ''){}

    /** создать папку
     * @param $dir
     * @return bool
     */
    function mkdir($dir){}


    /** получить размер и занятое пространство
     * @return array|bool -  ["quota-used-bytes"], ["quota-available-bytes"]
     */
    function size(){}

    /** опубликовать или скрыть файл или папку из общего доступа
     * @param string $url путь на Яндекс-диске.
     * @param bool $hide - true - скрыть
     * @return string|bool -  ссылка на файл или папку
     */
    function pub($url,$hide=false){}

    /** Проверить опубликован файл или папка для общего доступа
     * @param string $url путь на Яндекс-диске.
     * @return string|bool -  ссылка на файл/папку если опубликован или пустая строка
     */
    function is_pub($url){}

    /** раскодировать XML в массив
     * @param $xml
     * @return array|null
     */
    static function xml_decode($xml){}
}
?>

Пример работы с Яндекс-диском:

<?
$login = "логин@yandex.ru"; //можно и без @yandex.ru
$password = "пароль"; // можно использовать основной или завести отдельный для app приложений

$disk = new yd($login , $password);

echo "<br>Создать папку в хранилище";
if ($disk->mkdir('/backup')){
    echo '<p>OK</p>';
}else{
    echo '<p style="color:red">ERROR</p>';
}


echo "<br>Закачать файл в хранилище";
if ($disk->put($_SERVER['DOCUMENT_ROOT'] . '/download/pngcrush.zip', '/backup/pngcrush.zip')){
    echo '<p>OK</p>';
}else{
    echo '<p style="color:red">ERROR</p>';
}


echo "<br>получить список файлов в указанной директории";
if ($ls = $disk->dir('/backup/')){
    echo '<p>OK</p>'; var_dump($ls);
    /*{ [0]=> {
        ["href"]=> "/backup/pngcrush.zip" // исходное имя файла c путем от корня
        ["resourcetype"]=> ""
        ["getlastmodified"]=> "Fri, 26 Sep 2014 21:26:39 GMT"
        ["getetag"]=> "6af2c93801e3ca8a3eb7e00a9763945b"
        ["getcontenttype"]=> "application/x-zip-compressed" // mime/type файла, к примеру, может быть image/gif
        ["getcontentlength"]=> "139608" // размер файла в байтах
        ["displayname"]=> "pngcrush.zip"
        ["creationdate"]=> "2014-09-26T21:26:39Z" }
    }*/
    //echo "\n<br><br>".htmlspecialchars($disk->ansver,false,'utf-8');
} else {
    echo '<p style="color:red">ERROR</p>'; echo "\n<br>".htmlspecialchars($disk->ansver,false,'utf-8');
}

echo "<br>Предоставить публичный доступ к файлу ".$ls[0]['href'];
if ($u = $disk->pub($ls[0]['href'])){
    echo '<p>OK</p>'; var_dump($u);
} else {
    echo '<p style="color:red">ERROR</p>'; var_dump($disk->info); echo "\n<br>".htmlspecialchars($disk->ansver,false,'utf-8');
    exit;
}

echo "<br>Проверить публичный доступ к файлу ".$ls[0]['href'];
if ($u = $disk->is_pub($ls[0]['href'])){
    echo '<p>OK</p>'; var_dump($u);
} else {
    echo '<p style="color:red">ERROR</p>'; var_dump($disk->info); echo "\n<br>".htmlspecialchars($disk->ansver,false,'utf-8');
}

echo "<br>Закрыть публичный доступ к файлу ".$ls[0]['href'];
if ($disk->pub($ls[0]['href'],!0)===true){
    echo '<p>OK</p>';
} else {
    echo '<p style="color:red">ERROR</p>'; var_dump($disk->info);echo "\n<br>".htmlspecialchars($disk->ansver,false,'utf-8');
}


echo "<br>Размер диска";
if ($size = $disk->size()){
    echo '<p>OK</p>';
    echo "<br>Занято: ".floor($size["quota-used-bytes"]/1024).'Кб, свободно: '. floor($size["quota-available-bytes"]/1024)."Кб";
} else {
    echo '<p style="color:red">ERROR</p>'; echo "\n<br>".htmlspecialchars($disk->ansver,false,'utf-8');
}

// скачать файл из хранилища
if ($data = $disk->get('/backup/pngcrush.zip')) {
    echo '<p>OK</p>';
    file_put_contents('~test.zip',$data);
} else {
    echo '<p style="color:red">ERROR</p>';
}

echo "<br>Удалить файл или папку";
if ($disk->delete('/backup/pngcrush.zip')){
    echo '<p>OK</p>';
}else{
    echo '<p style="color:red">ERROR</p>';
}
?>

Всего за 599 рублей (~7$) Вы можете приобрести полный пример и класс работы с Яндекс-диском. Весь класс хорошо документирован, оптимизирован и занимет чуть более 250 строк PHP кода. Код скрипта реализован на PHP, полностью открытый и не использует никаких дополнительных библиотек.

Соглашение по использованию платной версии:

  • Вы можете использовать полученный код в любых своих разработках, вы не обязаны указывать ссылку на источник.
  • Вы НЕ имеете права перепродавать её, размещать в свободном или ограниченном доступе, а также публиковать в любом виде.
  • Все остальные права сохраняются за автором.

Регистрация Войти Войти через VK Войти через FB Войти через Google Войти через Яндекс

При нажатии кнопки Оплатить и загрузить, Вы подтверждаете согласие с условиями использования скрипта, описанными на этой странице.
Вы будете перенаправлены на страницу выбора способа оплаты, после оплаты 599 рублей (~7$) начнется загрузка файла.
Чтобы мы не потеряли Вашу оплату при потере соединения, укажите Ваш действующий
адрес электронной почты
Сомневаетесь? Вы всегда сможете задать вопросы и получить помощь.


.