WP Rest API上传图片

时间:2016-05-25 08:50:16

标签: wordpress

我正在尝试通过Wordpress REST api v2上传图片。到目前为止,我所做的只是在wordpress媒体库中创建空条目。意思是他们有图像名称,但没有实际图像。

POST请求:

http://localhost/wordpress/wp-json/wp/v2/media

Authorization: Basic d29yZHByZXNzOndvcmRwcmVzcw==
Content-Type: application/json
Content-Disposition: attachment;filename=map2.jpg

{
  "source_url" : "file:///C:/Users/x/Desktop/map2.jpg"
}

响应:

{
  "id": 127,
  "date": "2016-05-25T08:43:30",
  "date_gmt": "2016-05-25T08:43:30",
  "guid": {
    "rendered": "http://localhost/wordpress/wp-content/uploads/2016/05/map2-3.jpg",
    "raw": "http://localhost/wordpress/wp-content/uploads/2016/05/map2-3.jpg"
  },
  "modified": "2016-05-25T08:43:30",
  "modified_gmt": "2016-05-25T08:43:30",
  "password": "",
  "slug": "map2-3",
  "status": "inherit",
  "type": "attachment",
  "link": "http://localhost/wordpress/map2-3/",
  "title": {
    "raw": "map2-3",
    "rendered": "map2-3"
  },
  "author": 1,
  "comment_status": "open",
  "ping_status": "closed",
  "alt_text": "",
  "caption": "",
  "description": "",
  "media_type": "image",
  "mime_type": "image/jpeg",
  "media_details": {},
  "post": null,
  "source_url": "http://localhost/wordpress/wp-content/uploads/2016/05/map2-3.jpg",
  "_links": {
    "self": [
      {
        "href": "http://localhost/wordpress/wp-json/wp/v2/media/127"
      }
    ],
    "collection": [
      {
        "href": "http://localhost/wordpress/wp-json/wp/v2/media"
      }
    ],
    "about": [
      {
        "href": "http://localhost/wordpress/wp-json/wp/v2/types/attachment"
      }
    ],
    "author": [
      {
        "embeddable": true,
        "href": "http://localhost/wordpress/wp-json/wp/v2/users/1"
      }
    ],
    "replies": [
      {
        "embeddable": true,
        "href": "http://localhost/wordpress/wp-json/wp/v2/comments?post=127"
      }
    ]
  }
}

我没有错误,一切似乎都在工作,除了响应 - > 发布和响应 - > media_details 为空或空。当然图像本身没有上传。

根据此GitHub WP-API Adding Media票证,我应该发送2个请求。第一个POST请求应返回带有post对象的数据。我会通过PUT方法发送这个帖子对象,并且应该上传图片...因为我没有帖子对象,所以这是不可能的。

任何想法我做错了什么?

5 个答案:

答案 0 :(得分:17)

wordpress api不支持侧载图像,因此您必须进行一些更改。

首先,您的content-type应该是 image / jpeg 而不是 application / json ,请记住内容类型应该反映您的数据传递和POST媒体请求需要一个图像。

为了适应内容类型,您必须进行的另一项更改是传递数据的方式。不要使用source_url参数发送它,而是尝试将其作为二进制文件传递。

我要提到的最后一件事是wp / v2调用会在几次返回3XX状态。遵循这些重定向并将这些请求重做到这些新URL会很有用。

我在传递JPEG图像方面遇到了一些问题,但PNG图像运行良好。这是我用来上传png媒体的卷曲示例:

curl --request POST \
--url http://www.yoursite.com/wp-json/wp/v2/media \
--header "cache-control: no-cache" \
--header "content-disposition: attachment; filename=tmp" \
--header "authorization: Basic d29yZHByZXNzOndvcmRwcmVzcw==" \
--header "content-type: image/png" \
--data-binary "@/home/web/tmp.png" \
--location

答案 1 :(得分:3)

我使用PHP cUrl的工作答案

fourvalue = [2,6,8,1,19]
puts fourvalue.max
puts fourvalue.min

答案 2 :(得分:1)

在尝试使用wp_remote_post运行图像上传(出于多种原因不想使用curl)后,我想出了以下可行的解决方案:

// Upload image to wordpress media library

$file = @fopen( 'image.jpg', 'r' );
$file_size = filesize( 'image.jpg' );
$file_data = fread( $file, $file_size );
$args = array(
    'headers'     => array(
        'Authorization' => 'Basic ' . base64_encode( 'USERNAME:PASSWORD' ),
        'accept'        => 'application/json', // The API returns JSON
        'content-type'  => 'application/binary', // Set content type to binary
        'Content-Disposition' => 'attachment; filename=nameoffileonserver.jpg'
    ),
    'body'        => $file_data
    );



$api_response = wp_remote_post( 'http://myserver.com/wp-json/wp/v2/media', $args);

答案 3 :(得分:1)

在2020年1月使用带有nginx的wordpress 5.3.2的解决方案对我来说是

Comment.query.join(Comment.category).with_entities(
    Comment.category_id, Category.category_name, Comment.comment_desc
).all()

该令牌是Authorization JWT令牌,而$ archivo是文件路径。

答案 4 :(得分:1)

对于正在寻找JS解决方案的任何人,这就是我使用Axios使它起作用的方式。我将跳过授权实现,因为周围有一些选项(oAuth,JWT,Basic)。

#include <iostream>
#include <string>

int main(int, char**){
    auto s = std::string("a") + "b" + "c";
    std::cout << "s = " << s << '\n';
    return 0;
}