Add media with WP-Rest-API v2

时间:2015-11-26 作者:kain34440

我需要您的帮助,通过Wp rest api v2和Oauth2身份验证在我的wordpress博客中上传媒体图像。

我在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(\'Redirect\');
}
else
{
    $params = array(\'code\' => $_GET[\'code\'], \'redirect_uri\' => REDIRECT_URI);
    $response = $client->getAccessToken(TOKEN_ENDPOINT, \'authorization_code\', $params); //authorization_code
    $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" => "Titre media",       
    "description" => "description media",
    "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] => No data supplied
            [data] => Array
                (
                    [status] => 400
                )

        )

    [code] => 400
    [content_type] => application/json; charset=UTF-8
)
有什么想法吗?非常感谢

3 个回复
最合适的回答,由SO网友:MikeNGarrett 整理而成

所以这很有趣。

请记住,WP-API仍在进行中。

我找到了内容配置an issue reported on the WP-API issue queue 关于内容处置。这是发布新媒体内容所必需的标题,在以适当的格式提供时,有一些非常非常严格的要求。

创建媒体端点的目的首先,让我们后退一步。API假定此时您已将新文件上载到正确的目录。此终结点正在数据库中创建引用此文件的媒体内容。

解决方案是,您必须指定要与新内容关联的媒体文件的文件名。这不能是远程url。正如您从v2 documentation, source_urllink 是只读的。要成功提交新内容,只需在标题中添加以下内容:

\'Content-Disposition\' => \'filename=name-of-file.jpg\',
如票证中所述,您不能添加引号或指定发送文件的方法。信息技术must 采用上述格式。至少,在他们彻底改变之前,情况是这样的。

确保文件类型是accepted file types 您正在将文件的扩展名包含在请求中。幸亏Dr Deo 在评论中。

为了记录在案,当我最终弄明白这一点时,我欣喜若狂地笑了起来。。。把我妻子吓坏了。

SO网友:pHiL

为了“交叉引用”,请参见我的related answer here on StackOverflow 关于媒体上传和将该媒体用作帖子的“特色媒体”。

SO网友:minhhq

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配置。php为管理员用户禁用Fiter

define(\'ALLOW_UNFILTERED_UPLOADS\', true);

相关推荐

使用自定义上载文件夹的Media_Handle_Upload?

我为阿凡达建立了一个自定义图像上传程序,我真的很喜欢media_handle_upload() 创建不同大小的图像。因为它们是化身,而不是帖子的数据,我不希望它们被放在默认的WordPress上传文件夹中。是否可以继续使用media_handle_upload() 同时定义自定义上载文件夹?