API Яндекс.Диск (PHP) #3: Загрузка и скачивание файлов — PROG-TIME

API Яндекс.Диск (PHP) #3: Загрузка и скачивание файлов

18.04.2023
Содержание:

В новом уроке мы рассмотрим как создавать директории, добавлять файлы и скачивать файлы через API Яндекс.Диск. Так же мы рассмотрим процесс отправки PUT запросов.

Создание директорий на Яндекс.Диск через API

Для создания директорий мы будем отправлять запросы по уже известному нам пути.

https://cloud-api.yandex.net/v1/disk/resources/

Только в данном случае нам нужно отправлять запросы методом PUT.

Мы в предыдущих уроках подготовили наш метод sendQueryYaDisk() под отправку PUT запросов, поэтому просто передадим ему в качестве третьего параметра строку ‘PUT’.

/**
 * Метод для создания директории
 *
 * @param array $arrParams параметры для отправки запроса
 *
 * @return array
 */
public function disk_resources_create_dir(array $arrParams): array
{
    $urlQuery = 'https://cloud-api.yandex.net/v1/disk/resources/';
    return $this->sendQueryYaDisk($urlQuery, $arrParams, 'PUT');
}

Загрузка файлов на Яндекс.Диск через API

Загрузка файлов производится с помощью двух запросов:

  • запрос на получение ссылки для загрузки
  • отправка файлов по полученному URL из предыдущего запроса

Я объединил эти два запроса в один метод.

Метод будет принимать 2 параметра:

  • $filePath — путь до файла на вашем сервере
  • $dirPath — путь до директории на Яндекс.Диск куда нужно загрузить файл
/**
 * Метод для загрузки файлов
 *
 * @param string $filePath путь до файла
 * @param string $dirPath путь до директории на Яндекс.Диск
 *
 * @return string
 */
public function disk_resources_upload(string $filePath, string $dirPath = ''): string
{
    /* отправляем запрос на получение ссылки для загрузки */
    $arrParams = [
        'path' => $dirPath . basename($filePath),
        'overwrite' => 'true',
    ];

    $urlQuery = 'https://cloud-api.yandex.net/v1/disk/resources/upload';
    $resultQuery = $this->sendQueryYaDisk($urlQuery, $arrParams);
    /* ----------------- */

    if (empty($resultQuery['error'])) {
        /* Если ошибки нет, то отправляем файл на полученный URL. */
        $fp = fopen($filePath, 'r');
    
        $ch = curl_init($resultQuery['href']);
        curl_setopt($ch, CURLOPT_PUT, true);
        curl_setopt($ch, CURLOPT_UPLOAD, true);
        curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filePath));
        curl_setopt($ch, CURLOPT_INFILE, $fp);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_HEADER, false);
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
    
        return $http_code;
    } else {
        return $resultQuery['message'];
    }
}

Скачивание файла с Яндекс.Диска через API

Скачивание файлов происходит так же с помощью двух запросов:

  • запрос для получения разрешения на скачивание
  • запрос для загрузки файла на сервер

Метод для загрузки будет принимать 2 параметра, только в этот раз первый параметр будет принимать путь до файла в Яндекс.Диске, а второй параметр будет указывать директорию в которую этот файл нужно загрузить.

/**
 * Метод для скачивания файлов на сервера
 *
 * @param string $filePath путь до файла в Яндекс.Диске
 * @param string $dirPath путь до директории на сервере
 *
 * @return array
 */
public function disk_resources_download(string $filePath, string $dirPath = ''): array
{
    /* отправляем запрос на получение ссылки для скачивания */
    $arrParams = [
        'path' => $filePath,
    ];

    $urlQuery = 'https://cloud-api.yandex.net/v1/disk/resources/download';
    $resultQuery = $this->sendQueryYaDisk($urlQuery, $arrParams);
    /* ----------------- */

    if(empty($resultQuery['error'])) {
        $file_name = $dirPath . basename($filePath);
        $file = @fopen($file_name, 'w');
    
        $ch = curl_init($resultQuery['href']);
        curl_setopt($ch, CURLOPT_FILE, $file);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $this->token));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_HEADER, false);
        $resultQuery = curl_exec($ch);
        curl_close($ch);

        fclose($file);

        return [
            'message' => 'Файл успешно загружен',
            'path' => $file_name,
        ];
    } else {
        return $resultQuery;
    }
}

Таким образом в новом уроке мы с вами научились:

  • загружать файлы с сервера на Яндекс.Диск через API
  • скачивать файлы с Яндекс.Диска на сервер через API
  • создавать директории на Яндекс.Диске через API

В следующем уроке я вам покажу как публиковать и убирать с публикации файлы загруженные через API.

Обновление 31.07.2024

Если у вас скачивается пустой файл, то вы можете немного преобразовать метод disk_resources_download().

/**
 * Метод для скачивания файлов на сервера
 *
 * @param string $filePath путь до файла в Яндекс.Диске
 * @param string $dirPath путь до директории на сервере
 *
 * @return array
 */
public function disk_resources_download(string $filePath, string $dirPath = ''): array
{
    /* отправляем запрос на получение ссылки для скачивания */
    $arrParams = [
        'path' => $filePath,
    ];

    $urlQuery = 'https://cloud-api.yandex.net/v1/disk/resources/download';
    $resultQuery = $this->sendQueryYaDisk($urlQuery, $arrParams);
    /* ----------------- */

    if(empty($resultQuery['error'])) {
        $file_name = $dirPath . basename($filePath);
        $ch = curl_init($resultQuery['href']);
        curl_setopt($ch, CURLOPT_FILE, $file);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $this->token));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
        $resultQuery = curl_exec($ch);
        file_put_contents($file_name, $resultQuery);
        curl_close($ch);

        return [
            'message' => 'Файл успешно загружен',
            'path' => $file_name,
        ];
    } else {
        return $resultQuery;
    }
}

Материалы курса