質問編集履歴

6 タイトル修正

Nanohana

Nanohana score 108

2017/08/13 20:03  投稿

$bodWordpress APIで画像を投稿したい
Wordpress APIで画像を投稿したいが画像が壊れてしまう
Wordpress 4.8でWordpress apiを使って画像をアップロードしたいです。
Oauthには、OAuth/OAuthClientを使っています。
```lang-php
$client = $this->createClient2();
$path="/var/www/html/webroot/files/xxx.jpg";
$multimedia=array('file'=>$path);
$result = $client->post($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/media',$multimedia);
```
の結果は
```lang-php
array(
   'code' => 'rest_upload_no_content_disposition',
   'message' => 'Content-Disposition が入力されていません。',
   'data' => array(
       'status' => (int) 400
   )
)
```
となってしまっていて画像がアップロードできません。
同様のスクリプトでカテゴリ追加などをやっていてそちらは動いています。
例えば、画像無しでカテゴリを追加する時(認証もできています)は
```lang-php
$client = $this->createClient2();
           $catename=array("name"=>"$companyname");
        $result = $client->post($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/categories',$catename);
```
でうまくいっているので、認証系がうまくいっていないわけではなく、画像の投げ方に問題があると睨んでいます。
ということで、回答頂いた内容を参考に少し改良したものを使って見ましたが、うまくいってなかったので、ライブラリも含めていじってみました。
```lang-php
$client = $this->createClient2();
$path="/var/www/html/webroot/files/xxx.jpg";
$multimedia=array('file'=>$path);
$result$client->postMultipartFormData2($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/media',array('contents[]' =>$path),array("title" => "Titre media","description" => "description media"));
public function postMultipartFormData2($accessTokenKey, $accessTokenSecret, $url, array $paths, array $postData = array()) {
       $accessToken = new OAuthToken($accessTokenKey, $accessTokenSecret);
       $request = $this->createRequest('POST', $url, $accessToken, array());
       $authorization = str_replace('Authorization: ', '', $request->to_header());
       return $this->doPostMultipartFormData2($url, $authorization, $paths, $postData);
   }
       private function doPostMultipartFormData2($url, $authorization, $paths,$data) {
             // App::uses('String', 'Utility');
           debug("aiueo");
               App::uses('CakeText', 'Utility');
       //$boundary = String::uuid();
       $boundary = CakeText::uuid();
       $body = "--{$boundary}\r\n";
       foreach ($data as $key => $value) {
           $body .= "Content-Disposition: form-data; name=\"{$key}\"\r\n";
           $body .= "\r\n";
           $body .= "{$value}\r\n";
           $body .= "--{$boundary}\r\n";
       }
       foreach ($paths as $key => $path) {
           $filename=basename($path);
           $body .= "Content-Disposition: attachment; filename=\"{$filename}\"\r\n";
           $body .= "\r\n";
           $body .= file_get_contents($path) . "\r\n";
           $body .= "--{$boundary}--\r\n";
       }
           $nakami=file_get_contents($path);
           
       $socket = new HttpSocket();
       $result = $socket->request(array('method' => 'POST',
                                        'uri' => $url,
                                        'header' => array(
                                            'Authorization' => $authorization,
                                            'Content-Disposition'=> "attachment; filename=\"{$filename}\"\r\n",
                                            //'Content-Type' => "multipart/form-data; boundary={$boundary}"
                                            'Content-Type'=> "image/jpeg"
                                            //"content"=>"$nakami",
                                            ),
                                        'body' => $body
                                        ));
       $this->fullResponse = $result;
       return $result;
   }
```
としました。一応、ファイル自体のアップロードには成功しました。
が、ファイルが246kbと適切な大きさはあるようですが、画像の表示に失敗します。
![イメージ説明](018a7404d1179c5e22590a83d4fba9b1.png)
何が原因でしょうか
何かHeaderやbodyで足らない情報あるんですかね...
開けない画像はブラウザやダウンロードでプレビューしても表示できませんが、Photoshopでは開けました。
https://1st-train.net/wp-content/uploads/2017/08/be8f1caaf1adcafaf22f912175162c170463a4ad_z-4.jpg
https://1st-train.net/wp-content/uploads/2017/08/be8f1caaf1adcafaf22f912175162c170463a4ad_z-4.jpg
どうやったら壊れないようにできるのでしょうか?
  • PHP

    25493 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    9586 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

5 改善

Nanohana

Nanohana score 108

2017/08/13 18:43  投稿

$bodWordpress APIで画像を投稿したい
Wordpress 4.8でWordpress apiを使って画像をアップロードしたいです。
Oauthには、OAuth/OAuthClientを使っています。
```lang-php
$client = $this->createClient2();
$path="/var/www/html/webroot/files/xxx.jpg";
$multimedia=array('file'=>$path);
$result = $client->post($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/media',$multimedia);
```
の結果は
```lang-php
array(
   'code' => 'rest_upload_no_content_disposition',
   'message' => 'Content-Disposition が入力されていません。',
   'data' => array(
       'status' => (int) 400
   )
)
```
となってしまっていて画像がアップロードできません。
同様のスクリプトでカテゴリ追加などをやっていてそちらは動いています。
例えば、画像無しでカテゴリを追加する時(認証もできています)は
```lang-php
$client = $this->createClient2();
           $catename=array("name"=>"$companyname");
        $result = $client->post($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/categories',$catename);
```
でうまくいっているので、認証系がうまくいっていないわけではなく、画像の投げ方に問題があると睨んでいます。
ということで、回答頂いた内容を参考に少し改良したものを使って見ましたが、うまくいってなかったので、ライブラリも含めていじってみました。
```lang-php
$client = $this->createClient2();
$path="/var/www/html/webroot/files/xxx.jpg";
$multimedia=array('file'=>$path);
$result$client->postMultipartFormData2($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/media',array('contents[]' =>$path),array("title" => "Titre media","description" => "description media"));
public function postMultipartFormData2($accessTokenKey, $accessTokenSecret, $url, array $paths, array $postData = array()) {
       $accessToken = new OAuthToken($accessTokenKey, $accessTokenSecret);
       $request = $this->createRequest('POST', $url, $accessToken, array());
       $authorization = str_replace('Authorization: ', '', $request->to_header());
       return $this->doPostMultipartFormData2($url, $authorization, $paths, $postData);
   }
       private function doPostMultipartFormData2($url, $authorization, $paths,$data) {
             // App::uses('String', 'Utility');
           debug("aiueo");
               App::uses('CakeText', 'Utility');
       //$boundary = String::uuid();
       $boundary = CakeText::uuid();
       $body = "--{$boundary}\r\n";
       foreach ($data as $key => $value) {
           $body .= "Content-Disposition: form-data; name=\"{$key}\"\r\n";
           $body .= "\r\n";
           $body .= "{$value}\r\n";
           $body .= "--{$boundary}\r\n";
       }
       foreach ($paths as $key => $path) {
           $filename=basename($path);
           $body .= "Content-Disposition: attachment; filename=\"{$filename}\"\r\n";
           $body .= "\r\n";
           $body .= file_get_contents($path) . "\r\n";
           $body .= "--{$boundary}--\r\n";
       }
           $nakami=file_get_contents($path);
           
       $socket = new HttpSocket();
       $result = $socket->request(array('method' => 'POST',
                                        'uri' => $url,
                                        'header' => array(
                                            'Authorization' => $authorization,
                                            'Content-Disposition'=> "attachment; filename=\"{$filename}\"\r\n",
                                            //'Content-Type' => "multipart/form-data; boundary={$boundary}"
                                            'Content-Type'=> "image/jpeg"
                                            //"content"=>"$nakami",
                                            ),
                                        'body' => $body
                                        ));
       $this->fullResponse = $result;
       return $result;
   }
```
としました。一応、ファイル自体のアップロードには成功しました。
が、ファイルが246kbと適切な大きさはあるようですが、画像の表示に失敗します。
![イメージ説明](018a7404d1179c5e22590a83d4fba9b1.png)
何が原因でしょうか
何かHeaderやbodyで足らない情報あるんですかね...
何かHeaderやbodyで足らない情報あるんですかね...
開けない画像はブラウザやダウンロードでプレビューしても表示できませんが、Photoshopでは開けました。
https://1st-train.net/wp-content/uploads/2017/08/be8f1caaf1adcafaf22f912175162c170463a4ad_z-4.jpg
  • PHP

    25493 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    9586 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

4 追記

Nanohana

Nanohana score 108

2017/08/13 18:39  投稿

$bodWordpress APIで画像を投稿したい
Wordpress 4.8でWordpress apiを使って画像をアップロードしたいです。
Oauthには、OAuth/OAuthClientを使っています。
```lang-php
$client = $this->createClient2();
$path="/var/www/html/webroot/files/xxx.jpg";
$multimedia=array('file'=>$path);
$result = $client->post($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/media',$multimedia);
```
の結果は
```lang-php
array(
   'code' => 'rest_upload_no_content_disposition',
   'message' => 'Content-Disposition が入力されていません。',
   'data' => array(
       'status' => (int) 400
   )
)
```
となってしまっていて画像がアップロードできません。
同様のスクリプトでカテゴリ追加などをやっていてそちらは動いています。
例えば、画像無しでカテゴリを追加する時(認証もできています)は
```lang-php
$client = $this->createClient2();
           $catename=array("name"=>"$companyname");
        $result = $client->post($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/categories',$catename);
```
でうまくいっているので、認証系がうまくいっていないわけではなく、画像の投げ方に問題があると睨んでいます。
ということで、回答頂いた内容を参考に少し改良したものを使って見ましたが、うまくいってなかったので、ライブラリも含めていじってみました。
```lang-php
$client = $this->createClient2();
$path="/var/www/html/webroot/files/xxx.jpg";
$multimedia=array('file'=>$path);
$result$client->postMultipartFormData2($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/media',array('contents[]' =>$path),array("title" => "Titre media","description" => "description media"));
public function postMultipartFormData2($accessTokenKey, $accessTokenSecret, $url, array $paths, array $postData = array()) {
       $accessToken = new OAuthToken($accessTokenKey, $accessTokenSecret);
       $request = $this->createRequest('POST', $url, $accessToken, array());
       $authorization = str_replace('Authorization: ', '', $request->to_header());
       return $this->doPostMultipartFormData2($url, $authorization, $paths, $postData);
   }
       private function doPostMultipartFormData2($url, $authorization, $paths,$data) {
             // App::uses('String', 'Utility');
           debug("aiueo");
               App::uses('CakeText', 'Utility');
       //$boundary = String::uuid();
       $boundary = CakeText::uuid();
       $body = "--{$boundary}\r\n";
       foreach ($data as $key => $value) {
           $body .= "Content-Disposition: form-data; name=\"{$key}\"\r\n";
           $body .= "\r\n";
           $body .= "{$value}\r\n";
           $body .= "--{$boundary}\r\n";
       }
       foreach ($paths as $key => $path) {
           $filename=basename($path);
           $body .= "Content-Disposition: attachment; filename=\"{$filename}\"\r\n";
           $body .= "\r\n";
           $body .= file_get_contents($path) . "\r\n";
           $body .= "--{$boundary}--\r\n";
       }
           $nakami=file_get_contents($path);
           
       $socket = new HttpSocket();
       $result = $socket->request(array('method' => 'POST',
                                        'uri' => $url,
                                        'header' => array(
                                            'Authorization' => $authorization,
                                            'Content-Disposition'=> "attachment; filename=\"{$filename}\"\r\n",
                                            //'Content-Type' => "multipart/form-data; boundary={$boundary}"
                                            'Content-Type'=> "image/jpeg"
                                            //"content"=>"$nakami",
                                            ),
                                        'body' => $body
                                        ));
       $this->fullResponse = $result;
       return $result;
   }
```
としました。一応、ファイル自体のアップロードには成功しました。
が、ファイルが246kbと適切な大きさはあるようですが、画像の表示に失敗します。
![イメージ説明](018a7404d1179c5e22590a83d4fba9b1.png)
何が原因でしょうか
何が原因でしょうか
何かHeaderやbodyで足らない情報あるんですかね...
  • PHP

    25493 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    9586 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

3 $bodyを変更

Nanohana

Nanohana score 108

2017/08/13 17:33  投稿

Wordpress APIで画像を投稿したい
$bodWordpress APIで画像を投稿したい
Wordpress 4.8でWordpress apiを使って画像をアップロードしたいです。
Oauthには、OAuth/OAuthClientを使っています。
```lang-php
$client = $this->createClient2();
$path="/var/www/html/webroot/files/xxx.jpg";
$multimedia=array('file'=>$path);
$result = $client->post($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/media',$multimedia);
```
の結果は
```lang-php
array(
   'code' => 'rest_upload_no_content_disposition',
   'message' => 'Content-Disposition が入力されていません。',
   'data' => array(
       'status' => (int) 400
   )
)
```
となってしまっていて画像がアップロードできません。
同様のスクリプトでカテゴリ追加などをやっていてそちらは動いています。
例えば、画像無しでカテゴリを追加する時(認証もできています)は
```lang-php
$client = $this->createClient2();
           $catename=array("name"=>"$companyname");
        $result = $client->post($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/categories',$catename);
```
でうまくいっているので、認証系がうまくいっていないわけではなく、画像の投げ方に問題があると睨んでいます。
ということで、回答頂いた内容を参考に少し改良したものを使って見ましたが、うまくいってなかったので、ライブラリも含めていじってみました。
```lang-php
$client = $this->createClient2();
$path="/var/www/html/webroot/files/xxx.jpg";
$multimedia=array('file'=>$path);
$result$client->postMultipartFormData2($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/media',array('contents[]' =>$path),array("title" => "Titre media","description" => "description media"));
public function postMultipartFormData2($accessTokenKey, $accessTokenSecret, $url, array $paths, array $postData = array()) {
       $accessToken = new OAuthToken($accessTokenKey, $accessTokenSecret);
       $request = $this->createRequest('POST', $url, $accessToken, array());
       $authorization = str_replace('Authorization: ', '', $request->to_header());
       return $this->doPostMultipartFormData2($url, $authorization, $paths, $postData);
   }
       private function doPostMultipartFormData2($url, $authorization, $paths,$data) {
             // App::uses('String', 'Utility');
           debug("aiueo");
               App::uses('CakeText', 'Utility');
       //$boundary = String::uuid();
       $boundary = CakeText::uuid();
       $body = "--{$boundary}\r\n";
       foreach ($data as $key => $value) {
           $body .= "Content-Disposition: form-data; name=\"{$key}\"\r\n";
           $body .= "\r\n";
           $body .= "{$value}\r\n";
           $body .= "--{$boundary}\r\n";
       }
       foreach ($paths as $key => $path) {
           $filename=basename($path);
           $body .= "Content-Disposition: attachment; filename=\"{$filename}\"\r\n";
           $body .= "\r\n";
           $body .= file_get_contents($path) . "\r\n";
           $body .= "--{$boundary}--\r\n";
       }
           $nakami=file_get_contents($path);
           
       $socket = new HttpSocket();
       $result = $socket->request(array('method' => 'POST',
                                        'uri' => $url,
                                        'header' => array(
                                            'Authorization' => $authorization,
                                            'Content-Disposition'=> "attachment; filename=\"{$filename}\"\r\n",
                                            //'Content-Type' => "multipart/form-data; boundary={$boundary}"
                                            'Content-Type'=> "image/jpeg"
                                            //"content"=>"$nakami",
                                            ),
                                        'body' => array(
                                            "content"=>"$nakami",
//                                         "link" => "/var/www/html/2nd/cake/app/webroot/files/xxx.jpg",
//                                         "source_url" => "/var/www/html/2nd/cake/app/webroot/files/xxx.jpg"
                                        )
                                        'body' => $body
                                        ));
       $this->fullResponse = $result;
       return $result;
   }
```
としました。一応、ファイル自体のアップロードには成功しました。
が、ファイルが246kbと適切な大きさはあるようですが、画像の表示に失敗します。
![イメージ説明](018a7404d1179c5e22590a83d4fba9b1.png)
何が原因でしょうか
  • PHP

    25493 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    9586 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

2 進捗報告

Nanohana

Nanohana score 108

2017/08/13 15:44  投稿

Wordpress APIで画像を投稿したい
Wordpress 4.8でWordpress apiを使って画像をアップロードしたいです。
Oauthには、OAuth/OAuthClientを使っています。
```lang-php
$client = $this->createClient2();
$path="/var/www/html/webroot/files/xxx.jpg";
$multimedia=array('file'=>$path);
$result = $client->post($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/media',$multimedia);
```
の結果は
```lang-php
array(
   'code' => 'rest_upload_no_content_disposition',
   'message' => 'Content-Disposition が入力されていません。',
   'data' => array(
       'status' => (int) 400
   )
)
```
となってしまっていて画像がアップロードできません。
同様のスクリプトでカテゴリ追加などをやっていてそちらは動いています。
例えば、画像無しでカテゴリを追加する時(認証もできています)は
```lang-php
$client = $this->createClient2();
           $catename=array("name"=>"$companyname");
        $result = $client->post($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/categories',$catename);
```
でうまくいっているので、認証系がうまくいっていないわけではなく、画像の投げ方に問題があると睨んでいます。
ということで、回答頂いた内容を参考に少し改良したものを使って見ました。
ということで、回答頂いた内容を参考に少し改良したものを使って見ましたが、うまくいってなかったので、ライブラリも含めていじってみました。
```lang-php
$client = $this->createClient2();
$path="/var/www/html/webroot/files/xxx.jpg";
$multimedia=array('file'=>$path);
$result$client->postMultipartFormData2($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/media',array('contents[]' =>$path),array("title" => "Titre media","description" => "description media"));
public function postMultipartFormData2($accessTokenKey, $accessTokenSecret, $url, array $paths, array $postData = array()) {
       $accessToken = new OAuthToken($accessTokenKey, $accessTokenSecret);
       $request = $this->createRequest('POST', $url, $accessToken, array());
       $authorization = str_replace('Authorization: ', '', $request->to_header());
       return $this->doPostMultipartFormData2($url, $authorization, $paths, $postData);
   }
       private function doPostMultipartFormData2($url, $authorization, $paths,$data) {
      // App::uses('String', 'Utility');
            // App::uses('String', 'Utility');
           debug("aiueo");
               App::uses('CakeText', 'Utility');
       //$boundary = String::uuid();
       $boundary = CakeText::uuid();
       $body = "--{$boundary}\r\n";
       foreach ($data as $key => $value) {
           $body .= "Content-Disposition: form-data; name=\"{$key}\"\r\n";
           $body .= "\r\n";
           $body .= "{$value}\r\n";
           $body .= "--{$boundary}\r\n";
       }
       foreach ($paths as $key => $path) {
           $filename=basename($path);
           $body .= "Content-Disposition: attachment; filename=\"{$filename}\"\r\n";
           $body .= "\r\n";
           $body .= file_get_contents($path) . "\r\n";
           $body .= "--{$boundary}--\r\n";
       }
           
           $nakami=file_get_contents($path);
           
       $socket = new HttpSocket();
       $result = $socket->request(array('method' => 'POST',
                                        'uri' => $url,
                                        'header' => array(
                                            'Authorization' => $authorization,
                                            'Content-Type' => "multipart/form-data; boundary={$boundary}"),
                                        'body' => $body));
                                            'Content-Disposition'=> "attachment; filename=\"{$filename}\"\r\n",
                                            //'Content-Type' => "multipart/form-data; boundary={$boundary}"
                                            'Content-Type'=> "image/jpeg"
                                            //"content"=>"$nakami",
                                            ),
                                        'body' => array(
                                            "content"=>"$nakami",
//                                         "link" => "/var/www/html/2nd/cake/app/webroot/files/xxx.jpg",
//                                         "source_url" => "/var/www/html/2nd/cake/app/webroot/files/xxx.jpg"
                                        )
                                        ));
       $this->fullResponse = $result;
       return $result;
   }
```
としましたが
```lang-php
array(
   'code' => 'json_oauth1_signature_mismatch',
   'message' => 'OAuth signature does not match',
   'data' => array(
       'status' => (int) 401
   )
)
```
と帰ってきています。認証には問題がなくても、POSTするデータが誤っていると、
認証エラーで戻ってくるようなので、認証エラーではないと思います。
としました。一応、ファイル自体のアップロードには成功しました。
が、ファイルが246kbと適切な大きさはあるようですが、画像の表示に失敗します。
![イメージ説明](018a7404d1179c5e22590a83d4fba9b1.png)
何が原因でしょうか
  • PHP

    25493 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    9586 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

1 追記

Nanohana

Nanohana score 108

2017/08/13 01:54  投稿

Wordpress APIで画像を投稿したい
Wordpress 4.8でWordpress apiを使って画像をアップロードしたいです。
Oauthには、OAuth/OAuthClientを使っています。
```lang-php
$client = $this->createClient2();
$path="/var/www/html/webroot/files/xxx.jpg";
$multimedia=array('file'=>$path);
$result = $client->post($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/media',$multimedia);
```
の結果は
```lang-php
array(
   'code' => 'rest_upload_no_content_disposition',
   'message' => 'Content-Disposition が入力されていません。',
   'data' => array(
       'status' => (int) 400
   )
)
```
となってしまっていて画像がアップロードできません。
同様のスクリプトでカテゴリ追加などをやっていてそちらは動いています。
例えば、画像無しでカテゴリを追加する時(認証もできています)は
```lang-php
$client = $this->createClient2();
           $catename=array("name"=>"$companyname");
        $result = $client->post($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/categories',$catename);
```
でうまくいっているので、認証系がうまくいっていないわけではなく、画像の投げ方に問題があると睨んでいます。
でうまくいっているので、認証系がうまくいっていないわけではなく、画像の投げ方に問題があると睨んでいます。
ということで、回答頂いた内容を参考に少し改良したものを使って見ました。
```lang-php
$client = $this->createClient2();
$path="/var/www/html/webroot/files/xxx.jpg";
$multimedia=array('file'=>$path);
$result$client->postMultipartFormData2($oauth_token,$oauth_token_secret,'https://xxx.net/wp-json/wp/v2/media',array('contents[]' =>$path),array("title" => "Titre media","description" => "description media"));
public function postMultipartFormData2($accessTokenKey, $accessTokenSecret, $url, array $paths, array $postData = array()) {
       $accessToken = new OAuthToken($accessTokenKey, $accessTokenSecret);
       $request = $this->createRequest('POST', $url, $accessToken, array());
       $authorization = str_replace('Authorization: ', '', $request->to_header());
       return $this->doPostMultipartFormData2($url, $authorization, $paths, $postData);
   }
       private function doPostMultipartFormData2($url, $authorization, $paths,$data) {
      // App::uses('String', 'Utility');
           debug("aiueo");
               App::uses('CakeText', 'Utility');
       //$boundary = String::uuid();
       $boundary = CakeText::uuid();
       $body = "--{$boundary}\r\n";
       foreach ($data as $key => $value) {
           $body .= "Content-Disposition: form-data; name=\"{$key}\"\r\n";
           $body .= "\r\n";
           $body .= "{$value}\r\n";
           $body .= "--{$boundary}\r\n";
       }
       foreach ($paths as $key => $path) {
           $filename=basename($path);
           $body .= "Content-Disposition: attachment; filename=\"{$filename}\"\r\n";
           $body .= "\r\n";
           $body .= file_get_contents($path) . "\r\n";
           $body .= "--{$boundary}--\r\n";
       }
           
           
       $socket = new HttpSocket();
       $result = $socket->request(array('method' => 'POST',
                                        'uri' => $url,
                                        'header' => array(
                                            'Authorization' => $authorization,
                                            'Content-Type' => "multipart/form-data; boundary={$boundary}"),
                                        'body' => $body));
       $this->fullResponse = $result;
       return $result;
   }
```
としましたが
```lang-php
array(
   'code' => 'json_oauth1_signature_mismatch',
   'message' => 'OAuth signature does not match',
   'data' => array(
       'status' => (int) 401
   )
)
```
と帰ってきています。認証には問題がなくても、POSTするデータが誤っていると、
認証エラーで戻ってくるようなので、認証エラーではないと思います。
  • PHP

    25493 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    9586 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る