Простая работа с Yandex Disk API
Некоторое время назад мы уже рассматривали работу с Google Drive API на PHP.
На этот раз рассмотрим работу с Яндекс.Диск API на PHP. В этом примере я буду использовать библиотеку nixsolutions/yandex-php-library (к сожалению, данная библиотека больше не доступна).
Сразу же отмечу, что данная библиотека уже устарела и ее не рекомендуется использовать в рабочем проекте. Но в нашем случае, пример был написан давно и носит он исключительно учебный характер.
Описывать подробно процесс получения токена не стану, т.к. это выходит за рамки данной статьи. Однако, чтобы получить токен, для начала необходимо авторизироваться в Яндекс и попробовать создать новое приложение (в качестве доступа отмечаем все галочки в разделе Яндекс.Диск REST API).
Листинг основного файла (index.php).
<?php
session_start(); // Стартуем сессии/**
* Описание библиотеки для работы я Яндекс-диском
* https://github.com/nixsolutions/yandex-php-library/wiki/Yandex-Disk
*
* Документация по API Яндекс-диска
* https://tech.yandex.ru/disk/doc/dg/concepts/quickstart-docpage/
*/// Подключение автозагрузчика от Composer
require_once dirname(__FILE__) . '/vendor/autoload.php';use Yandex\OAuth\OAuthClient;
use Yandex\OAuth\Exception\AuthRequestException;
use Yandex\Disk\DiskClient;/**
* Регистрация приложения
* https://oauth.yandex.ru/client/new
*/
$settings = [
'clientId' => '72e71c9455ef410ba4aeef934f75ff8e', // ID приложения
'clientSecret' => 'ef98af12eece46448c17212f73a96b11', // Никому не называть
'callbackUrl' => 'http://' . $_SERVER ['HTTP_HOST'], // Url переадресации
'uriPath' => 'https://disk.yandex.ru/client/disk' // Используется для навигации по структуре диска
];// Подключаемся к клиенту API Яндекса
$client = new OAuthClient($settings['clientId'], $settings['clientSecret']);// Если в URL передана переменная с значением "code"
if (isset($_REQUEST['code'])) {
// Попытка получения токена, иначе вывод ошибок
try {
$client->requestAccessToken($_REQUEST['code']);
} catch (AuthRequestException $e) {
echo $e->getMessage();
}// Сохранение токена в сессию
$_SESSION['accessToken'] = $client->getAccessToken();// Переадресация на главную страницу
header('Location: ' . $settings['callbackUrl']); exit();} elseif (!isset($_SESSION['accessToken'])) {
$client->authRedirect(true, OAuthClient::CODE_AUTH_TYPE);
}// Проверяем, если существует токен
if (isset($_SESSION['accessToken'])){
$diskClient = new DiskClient($_SESSION['accessToken']);// Информация о пользователе
$login = explode("\n", $diskClient->getLogin());// Извлекаем информацию о свободном и занятом месте
$diskSpace = $diskClient->diskSpaceInfo();// Получаем информацию о содержимом диска
$dirContent = $diskClient->directoryContents('/');// Если были отправлены POST-запросы
if ($_POST){/**
* Загрузка файла на диск
*/
if (isset($_POST['upload']) && isset($_FILES['files'])){
if ($_FILES['files']['error'][0] == 0) {
$files = normalizeFilesArray($_FILES);foreach ($files as $file) {
$tmp = file_get_contents($file['tmp_name']);$diskClient->uploadFile('/',
[
'path' => $file['tmp_name'],
'size' => $file['size'],
'name' => $file['name']
]
);
}// Переадресация на главную страницу
header('Location: ' . $settings['callbackUrl']); exit();
}
}/**
* Удаление выбранного файла
*/
if (isset($_POST['delete']) && isset($_POST['delFile'])){$diskClient->delete($_POST['delFile']);
// Переадресация на главную страницу
header('Location: ' . $settings['callbackUrl']); exit();
}}
}/**
* Нормальный вид для отображения размера файлов
* @param $size
* @return string
*/
function humanBytes($size)
{
$fileSizeName = [' байт', ' Кб', ' Мб', ' Гб', ' Тб', ' Пб', ' Эб', ' Зб', ' Йб'];
return $size ? round($size / pow(1024, ($i = floor(log($size, 1024)))), 2) . $fileSizeName[$i] : '0 байт';
}