Добавление медиафайлов через WP-Rest-API v2

26 нояб. 2015 г., 10:18:46
Просмотры: 33.6K
Голосов: 12

Мне нужна помощь в загрузке медиа-изображения в мой блог WordPress через WP-REST-API v2 с аутентификацией OAuth2.

Я не нашел в документации REST API способ отправки данных изображения (название поля, режим отправки...?).

require('OAuth2/Client.php');
require('OAuth2/GrantType/IGrantType.php');
require('OAuth2/GrantType/AuthorizationCode.php');

const CLIENT_ID     = 'XXX';
const CLIENT_SECRET = 'XX';

const REDIRECT_URI           = 'http://127.0.0.1/test_api_wp/test.php';

const AUTHORIZATION_ENDPOINT = 'http://wordpress.local/oauth/authorize';
const TOKEN_ENDPOINT         = 'http://wordpress.local/oauth/token';

$client = new OAuth2\Client(CLIENT_ID, CLIENT_SECRET);

if (!isset($_GET['code']))
{
    $auth_url = $client->getAuthenticationUrl(AUTHORIZATION_ENDPOINT, REDIRECT_URI);
    header('Location: ' . $auth_url);
    die('Перенаправление');
}
else
{
    $params = array('code' => $_GET['code'], 'redirect_uri' => REDIRECT_URI);
    $response = $client->getAccessToken(TOKEN_ENDPOINT, 'authorization_code', $params); //код_авторизации
    $token = $response['result']['access_token'];
    $client->setAccessToken($token);
    $client->setAccessTokenType(OAuth2\Client::ACCESS_TOKEN_BEARER);

}

$values = array(
    "date" => "2015-11-26 10:00:00",
    "date_gmt" => "2015-11-26 09:00:00",
    "modified" => "2015-11-26 10:00:00",
    "modified_gmt" => "2015-11-26 09:00:00",
    "status" => "future",
    "title" => "Заголовок медиафайла",       
    "description" => "описание медиафайла",
    "media_type" => "image",
    "source_url" => "https://www.base64-image.de/build/img/mr-base64-482fa1f767.png"
);

$data = $client->fetch("wordpress.local/wp-json/wp/v2/media", $values, "POST");
echo "<pre>";print_r($data);echo "</pre>";

Ответ:

Array
(
    [result] => Array
        (
            [code] => rest_upload_no_data
            [message] => Данные не предоставлены
            [data] => Array
                (
                    [status] => 400
                )

        )

    [code] => 400
    [content_type] => application/json; charset=UTF-8
)

Есть идеи? Большое спасибо

6
Комментарии

Я добавил код из вашего комментария к вопросу. Помните, что вы можете в любое время отредактировать вопрос, чтобы добавить больше информации или сделать его более понятным.

cybmeta cybmeta
26 нояб. 2015 г. 11:30:20

Лишняя ; в wordpress.local/wp-json/wp/v2/media"; — это опечатка только здесь или она есть и в вашем реальном коде тоже?

cybmeta cybmeta
26 нояб. 2015 г. 11:33:11

Согласно документации, WP REST API v2 требует этот OAuth плагин. Я не знаю, совместима ли используемая вами библиотека (OAuth2/Client.php) с WP REST API или нет, но, скорее всего, нет.

cybmeta cybmeta
26 нояб. 2015 г. 11:45:29

Большое спасибо! Дополнительный --> ; отсутствует в моем реальном коде! Я использую официальный плагин OAuth для аутентификации, файлы OAuth2.Client.php - это просто библиотека для удобного выполнения curl-запросов

kain34440 kain34440
26 нояб. 2015 г. 11:51:43

В (документации)[http://v2.wp-api.org/reference/media/] есть раздел Create a Media. Я думаю, ваш source_url должен находиться внутри объекта post.

ville6000 ville6000
26 нояб. 2015 г. 13:09:59

Привет ville6000, не мог бы ты пояснить свой комментарий?

kain34440 kain34440
26 нояб. 2015 г. 16:32:40
Показать остальные 1 комментариев
Все ответы на вопрос 3
4
11

Итак! Это интересно.

Имейте в виду, что WP-API все еще находится в стадии активной разработки.

Content-Disposition

Я обнаружил проблему, зарегистрированную в очереди задач WP-API, касающуюся заголовка Content-Disposition. Это обязательный заголовок для публикации нового медиа-контента, и существуют очень строгие требования к его правильному формату.

Назначение конечной точки Create Media

Во-первых, давайте сделаем шаг назад. API предполагает, что на этом этапе вы уже загрузили новый файл в нужную директорию. Эта конечная точка создает медиа-контент в базе данных, который ссылается на этот файл.

Решение

Вам необходимо указать имя файла медиа, который будет связан с вашим новым контентом. Это не может быть удаленный URL. Как видно из документации версии 2, source_url и link доступны только для чтения. Все, что вам нужно сделать для успешной отправки нового контента, это добавить следующий заголовок:

'Content-Disposition' => 'filename=имя-файла.jpg',

Как упоминалось в тикете, вы не можете добавлять кавычки или указывать метод, с помощью которого отправляете файл. Формат должен быть именно таким, как указано выше. По крайней мере, так обстоят дела, пока всё не изменят снова.

Убедитесь, что тип файла входит в список разрешенных типов, и что расширение файла указано в запросе. Спасибо Dr Deo за комментарий.

К вашему сведению, я смеялся от радости, когда наконец разобрался с этим... и здорово напугал свою жену.

14 февр. 2016 г. 06:03:32
Комментарии

Огромное спасибо за подсказку с Content-Disposition!

pHiL pHiL
20 июл. 2016 г. 02:01:34

Я думаю, этот ответ является лишь подсказкой, а не полным решением. Я следую этому совету и получаю ошибку Sorry, this file type is not permitted for security reasons

Brethlosze Brethlosze
16 янв. 2019 г. 15:44:58

@Brethlosze Это звучит как несвязанная проблема. WordPress блокирует определённые типы медиа при обычной загрузке.

MikeNGarrett MikeNGarrett
17 янв. 2019 г. 17:38:20

@Brethlosze расширение файла должно быть одного из разрешенных типов. Например, это работает curl --request POST --url http://localhost/kayinjaproject/wp-json/wp/v2/media --header "cache-control: no-cache" --header "content-disposition: attachment; filename=tmp.png" --header "authorization: Basic cm9vdDppYW1haGVybw==" --header "content-type: image/png" --data-binary "@c:/gnu/png.png" --location, но если вы уберете png из имени файла tmp.png, вы получите error sorry, this file type is not permitted for security reasons

Dr Deo Dr Deo
1 февр. 2019 г. 13:41:28
0

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

20 июл. 2016 г. 02:01:13
0

Ответ для PHP CURL:

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'EndPoint',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => array('file'=> new CURLFILE('LocalFilePathHere')),
  CURLOPT_HTTPHEADER => array(
    'Content-Disposition: attachment; filename=abc.jpg',
    'Content-Type: image/jpeg',
    'Authorization: XXX YYY'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

Если вы всё ещё сталкиваетесь с ошибкой "Извините, этот тип файла не разрешён по соображениям безопасности", вам необходимо добавить в wp-config.php отключение фильтрации для пользователя с правами администратора:

define('ALLOW_UNFILTERED_UPLOADS', true);
13 апр. 2021 г. 13:32:22