leonied7 / yandex-disk-api
用于处理 Яндекс.диск API 的库
Requires
- php: >=5.6
- ext-curl: *
- ext-dom: *
- ext-fileinfo: *
- ext-json: *
- ext-mbstring: *
- servo/fluidxml: ^1.21
Requires (Dev)
- phpunit/phpunit: ^5.7.0
This package is auto-updated.
Last update: 2024-09-12 22:22:55 UTC
README
简介
非官方的 Яндекс.Диск 服务 PHP SDK
变更日志
27/12/2018
- 完全重写了与 API 交互的逻辑
- 简化了 SDK 的使用
- 更新了 README 文件
要求
- PHP 5.6+
- php_curl 扩展
安装
Composer
composer require leonied7/yandex-disk-api:dev-master
连接示例
require_once __DIR__ . "/vendor/autoload.php";
测试
从库根目录运行测试
vendor/phpunit/phpunit/phpunit --configuration phpunit.xml
描述
简介
SDK 使用WebDAV API Яднекс Диска。为了运行需要 OAuth-令牌(例如,AQACc1234LDE2f_123UIbouFHzfxxcvDI),需要自行获取
- 注册应用程序并自行获取令牌 https://oauth.yandex.ru/
OAuth-令牌必须具有 "Яндекс.Диск WebDAV API" 的权限
功能
- 处理 Яндекс.Диске的文件夹(创建、复制、移动、删除、发布等)
- 处理 Яндекс.Диске的文件(创建、上传、下载、复制、移动、删除、发布等)
- 流式下载和上传文件
- 分块下载文件
初始化
use \Leonied7\Yandex\Disk; $yandexDisk = new Disk('OAuth-токен');
使用
\Leonied7\Yandex\Disk
- 用于处理磁盘,获取磁盘和客户端的基本信息,并帮助处理文件和文件夹\Leonied7\Yandex\Disk\Item\File
- 用于处理文件/** @var \Leonied7\Yandex\Disk\Item\File $file */ $yandexDisk->file('/path/to/file/');
\Leonied7\Yandex\Disk\Item\Directory
- 用于处理目录/** @var \Leonied7\Yandex\Disk\Item\Directory $directory */ $directory = $yandexDisk->directory('/path/to/directory/');
使用的对象
-
\Leonied7\Yandex\Disk\Entity\Result - 执行任何对 Яндекс.Дис克的查询后,可以获取关于结果的信息
-
\Leonied7\Yandex\Disk\Entity\Collection
-
\Leonied7\Yandex\Disk\Item\Item
-
\Leonied7\Yandex\Disk\Model\Decorator
- \Leonied7\Yandex\Disk\Decorator\CurrentElement - 返回关于具有输入路径的元素的数据
- \Leonied7\Yandex\Disk\Decorator\CurrentElementCollection - 返回关于具有输入路径的元素集合的数据
- \Leonied7\Yandex\Disk\Decorator\CurrentElementCollectionItem - 返回关于具有输入路径的元素集合属性的数据
- \Leonied7\Yandex\Disk\Decorator\CurrentElementCollectionItemValue - 返回具有输入路径的元素集合属性值的
- \Leonied7\Yandex\Disk\Decorator\CurrentElementFailCollection - 返回具有输入路径的元素错误集合数组
- \Leonied7\Yandex\Disk\Decorator\ExplodeData - 返回拆分字符串为数组的 "键 => 值" 类型
-
\Leonied7\Yandex\Disk\Model\Stream
- \Leonied7\Yandex\Disk\Stream\File - 操作文件流,用于读写文件
使用
请求用户信息
$info = $yandexDisk->getInfo(); //вернёт примерно следующий результат Array ( [uid] => xxxxxxxxx [login] => login [fio] => fio [firstname] => firstname [lastname] => lastname [upload_concurrency] => 5 [datasync_db_prefix] => [is_b2b] => false )
请求可用/已用空间
/** @var \Leonied7\Yandex\Disk\Collection\PropertyCollection $spaceCollection */ $spaceCollection = $yandexDisk->spaceInfo(); //поиск в коллекции свойство с имененем 'quota-available-bytes' /** @var \Leonied7\Yandex\Disk\Property\Immutable $available */ $available = $spaceCollection->find('quota-available-bytes'); echo $available->getValue(); //свободное места /** @var \Leonied7\Yandex\Disk\Property\Immutable $used */ $used = $spaceCollection->find('quota-used-bytes'); echo $used->getValue(); //занятое места
上传文件(仅适用于文件)
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); $file->upload(new Disk\Stream\File('/path/to/local/file', Disk\Stream\File::MODE_READ)); //bool
文件下载(仅适用于文件)
SDK支持多种方式下载文件
-
流式下载
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); $file->download(new Disk\Stream\File('/path/to/local/file', Disk\Stream\File::MODE_WRITE)); //bool
-
分块流式下载
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); //скачивание первых 5 байт $file->download(new Disk\Stream\File('/path/to/local/file', Disk\Stream\File::MODE_WRITE), 0, 5); //bool //скачивание с 6 байта до конца $file->download(new Disk\Stream\File('/path/to/local/file', Disk\Stream\File::MODE_WRITE_APPEND), 6); //bool
-
非流式下载
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); $file->download(); //bool // получение последнего результата запроса $result = Disk\Collection\ResultList::getInstance()->getLast(); file_put_contents('/path/to/local/file', $result->getActualResult());
获取图片预览(仅适用于文件)
第一个参数传递预览大小,可以使用文档中的任何一种
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); $file->getPreview('S', new Disk\Stream\File('/path/to/local/file/', Disk\Stream\File::MODE_WRITE));
预览可以流式获取,也可以非流式获取
创建目录(仅适用于目录)
/** @var Disk\Item\Directory $directory */ $directory = $yandexDisk->directory('/path/to/directory/'); $directory->create(); // bool
获取目录内容(仅适用于目录)
/** @var Disk\Item\Directory $directory */ $directory = $yandexDisk->directory('/path/to/directory/'); /** @var Disk\Item\Item[] $arChild */ $arChild = $directory->getChildren(); /** @var Disk\Item\Item $child */ foreach ($arChild as $child) { if ($child->isDirectory()) { /** @var Disk\Item\Directory $directory */ $directory = $child; //работа с директорией } else { /** @var Disk\Item\File $file */ $file = $child; //работа с файлом } }
也可以使用第一个参数传递\Leonied7\Yandex\Disk\Collection\PropertyCollection类型的对象来获取所有元素的属性。
同样,第二个和第三个参数可以指定offset(偏移)
和amount(数量)
- 以获取所需元素范围。
检查元素是否存在(适用于文件/目录)
示例是为文件编写的,但该方法也适用于目录
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); $file->has(); // bool
由于检查存在使用的是属性查询方法,因此默认情况下,Yandex.Disk会返回属性。在调用
has()
方法时,可以传递\Leonied7\Yandex\Disk\Collection\PropertyCollection类型的对象。
示例
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); $collection = new Disk\Collection\PropertyCollection(); $collection ->add('getcontenttype', Disk\Model\Property::IMMUTABLE_NAMESPACES['dav']) //запрос типа содержимого ->add('displayname', Disk\Model\Property::IMMUTABLE_NAMESPACES['dav']) //запрос имени содержимого ->add('myprop', 'mynamespace'); //полученис своего свойства $file->has($collection); // bool
如果不传递对象,则将自动选择所有可用的属性。
可以通过以下方式获取传入的属性
/** @var Disk\Collection\PropertyCollection $collection */ $collection = $file->getProperties();
或
/** @var Disk\Collection\PropertyCollection $collection */ $collection1 = Disk\Collection\ResultList::getInstance()->getLast()->getResult();
结果将仅存储成功获取的属性。
为了获取错误的属性
/** @var Disk\Collection\PropertyFail[] $failCollections */ $failCollections = Disk\Collection\ResultList::getInstance()->getLast()->getDecorateResult(new Disk\Decorator\CurrentElementFailCollection($file->getPath())); foreach ($failCollections as $failCollection) { $failCollection->getStatus(); //получение статуса ответа от Яндекс.Диска для коллекции //так же можно применять такие же методы что и для Disk\Property\Immutable }
复制元素(适用于文件/目录)
示例是为文件编写的,但该方法也适用于目录
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); $file->copy('/path/to/copy/'); // bool
按标准,如果文件已存在,则会被覆盖。要禁止覆盖,需要将第二个参数传递为
false
移动元素(适用于文件/目录)
示例是为文件编写的,但该方法也适用于目录
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); $file->move('/path/to/move/'); // bool
按标准,如果文件已存在,则会被覆盖。要禁止覆盖,需要将第二个参数传递为
false
删除元素(适用于文件/目录)
示例是为文件编写的,但该方法也适用于目录
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); $file->delete(); // bool
加载元素属性(适用于文件/目录)
示例是为文件编写的,但该方法也适用于目录
/** @var \Yandex\Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); //создаём коллекцию и добавляем в неё 3 свойства $propertyCollection = new \Yandex\Disk\Collection\Property(); $propertyCollection ->add('myprop', 'mynamespace') ->add('propmy', 'mynamespace') ->add('propprop', 'mynamespace'); /** @var \Yandex\Disk\Collection\Property $loadCollection */ $loadCollection = $file->loadProperties($propertyCollection); /** @var \Yandex\Disk\Collection\Property $property */ foreach ($loadCollection as $property) { // работаем со свойствами }
之前成功加载的属性可以通过
$file->getProperties();
获取
结果将仅存储成功获取的属性。
为了获取错误的属性
/** @var \Yandex\Disk\Collection\PropertyFail[] $convertedResult */ $failCollections = $file->getLastResult()->getDecorateResult(new \Yandex\Disk\Decorator\CurrentElementFailCollection($file->getPath())); foreach ($failCollections as $failCollection) { $failCollection->getStatus() //получение статуса ответа от Яндекс.Диска }
获取现有属性(适用于文件/目录)
示例是为文件编写的,但该方法也适用于目录
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); /** @var Disk\Collection\PropertyCollection $propertyCollection */ $propertyCollection = $file->getExistProperties();
注意!!!属性不带值返回,且不能通过
$file->getProperties();
获取
修改元素属性(适用于文件/目录)
示例是为文件编写的,但该方法也适用于目录
修改元素属性有两种方法
-
修改传递的属性
添加具有
mynamespace
命名空间的属性myprop
和propmy
,值分别为foo
和bar
。删除属性propprop
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); $propertyCollection = new Disk\Collection\PropertyCollection(); $propertyCollection ->add('myprop', 'mynamespace', 'foo') ->add('propmy', 'mynamespace', 'bar') ->add('propprop', 'mynamespace'); $file->changeProperties($propertyCollection); // bool
-
保存预先获取的属性
未命名的属性不会保存
加载属性
myprop
,propmy
,propprop
,quota-available-bytes
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); $propertyCollection = new Disk\Collection\PropertyCollection(); $propertyCollection ->add('myprop', 'mynamespace') ->add('propmy', 'mynamespace') ->add('quota-available-bytes', Disk\Model\Property::IMMUTABLE_NAMESPACES['dav']) ->add('propprop', 'mynamespace'); /** @var Disk\Collection\PropertyCollection $loadCollection */ $loadCollection = $file->loadProperties($propertyCollection);
在加载的集合中存在两种类型的属性,可修改的和不可修改的
对于内置的Yandex.Disk属性,属性是不可修改的。例如
quota-available-bytes
将是不可修改的为了仅获取可修改的集合属性
/** @var Disk\Property\Mutable $property */ foreach ($loadCollection->getChangeable() as $property) { $property->setValue('baz'); //устанавливаем новое значение }
也可以通过属性的
canChanged()
方法来了解是否可以修改属性// добавляем новое свойство $loadCollection->add('newprop', 'mynamespace', 'bar'); // добавляем неизменяемое свойств (свойство не будет сохранятся) $loadCollection->add('immutable', Disk\Model\Property::IMMUTABLE_NAMESPACES['dav'], 'immut');
之后保存修改后的值
$file->saveProperties();
发布元素(适用于文件/目录)
示例是为文件编写的,但该方法也适用于目录
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); $file->startPublish(); // bool //получение публичной ссылки Disk\Collection\ResultList::getInstance()->getLast()->getResult(); // string
关闭元素发布(适用于文件/目录)
示例是为文件编写的,但该方法也适用于目录
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); $file->stopPublish(); // bool
检查元素发布状态(适用于文件/目录)
示例是为文件编写的,但该方法也适用于目录
/** @var Disk\Item\File $file */ $file = $yandexDisk->file('/path/to/file/'); $file->checkPublish(); // bool //получение публичной ссылки Disk\Collection\ResultList::getInstance()->getLast()->getResult(); // string