Войти через VK Войти через FB Войти через Google Войти через Яндекс
Поиск по сайту
Загрузка файлов на Яндекс.Диск с использованием 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 рублей (~6$) Вы можете приобрести полный пример и класс работы с Яндекс-диском. Весь класс хорошо документирован, оптимизирован и занимет чуть более 250 строк PHP кода. Код скрипта реализован на PHP, полностью открытый и не использует никаких дополнительных библиотек.
Соглашение по использованию платной версии:
- Вы можете использовать полученный код в любых своих разработках, вы не обязаны указывать ссылку на источник.
- Вы НЕ имеете права перепродавать её, размещать в свободном или ограниченном доступе, а также публиковать в любом виде.
- Все остальные права сохраняются за автором.
Регистрация Войти Войти через VK Войти через FB Войти через Google Войти через Яндекс
.
Прокомментировать/Отблагодарить