leonied7/yandex-disk-api

用于处理 Яндекс.диск API 的库

2.0.0-beta 2019-04-12 09:19 UTC

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),需要自行获取

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/');

使用的对象

使用

请求用户信息

$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支持多种方式下载文件

  1. 流式下载

    /** @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
  2. 分块流式下载

    /** @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
  3. 非流式下载

    /** @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() //получение статуса ответа от Яндекс.Диска
}

错误属性集合的完整描述\Leonied7\Yandex\Disk\Collection\PropertyFail

获取现有属性(适用于文件/目录)

示例是为文件编写的,但该方法也适用于目录

/** @var Disk\Item\File $file */
$file = $yandexDisk->file('/path/to/file/');
/** @var Disk\Collection\PropertyCollection $propertyCollection */
$propertyCollection = $file->getExistProperties();

注意!!!属性不带值返回,且不能通过$file->getProperties();获取

修改元素属性(适用于文件/目录)

示例是为文件编写的,但该方法也适用于目录

修改元素属性有两种方法

  1. 修改传递的属性

    添加具有mynamespace命名空间的属性myproppropmy,值分别为foobar。删除属性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
  2. 保存预先获取的属性

    未命名的属性不会保存

    加载属性myproppropmyproppropquota-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