質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

PHPのcurlで画像をPOSTしたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,081

kashios

score 5

前提・実現したいこと

「この猫なに猫?」というAPIを使って、送った画像から猫の種類をテキストでブラウザ上に表示するだけのことがしたいです。
http://www.metadata.co.jp/whatcat-api-specifications.html

コマンドラインからは以下を実行することで結果が返ってくるのですが、

curl -u hoge:hoge -F "image=@./cat_example.jpg" http://whatcat.ap.mextractr.net/api_query

PHPのcurlを使って実装しようと思ったのですが、"invalid file is used"という返り値が戻ってきます。

該当のソースコード

<body>
    <form action="api.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" />
  </form>
</body>
<?php
  // api.php
  $curl = curl_init();
  $api_url = 'http://whatcat.ap.mextractr.net/api_query';
  $params = array('image' => '@'.$_FILES["file"]["tmp_name"]);

  curl_setopt($curl, CURLOPT_URL, $api_url);
  curl_setopt($curl, CURLOPT_USERPWD, "hoge:hoge");
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data'));
  curl_setopt($curl, CURLOPT_POST, true);
  curl_setopt($curl, CURLOPT_POSTFIELDS, $params );
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

  echo('<pre>');
  var_dump("params:".print_r($params,true));
  echo('</pre>');

  $data = curl_exec($curl);
  curl_close($curl);  
  $res = json_decode($data);

  echo('<pre>');
  var_dump("res:".print_r($res,true));
  echo('</pre>');

  var_dump($res[0][0]);
?>

実行結果

string(70) "params:Array
(
    [image] => @/Applications/MAMP/tmp/php/phpYSniGz
)
"
string(62) "res:stdClass Object
(
    [message] => invalid file is used
)
"

画像データをどういった形で渡せばいいのかわからず、、、ご助言いただけると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

php のバージョンはいくつでしょうか?

cUrl のパラメータでファイルアップロードの指定として @を使う方法は Ver.5.5 から非推奨となっており、Ver.5.6 以降は使用できません。
代わりに curlfile を使うことになっています。

http://www.php.net/manual/ja/class.curlfile.php

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/20 11:10

    curlfile使うと解決しました!ありがとうございます! Ver.5.5と Ver.7.0.12の環境で試していたのでダメだったみたいです。。。

    キャンセル

0

curlfile使うと解決しました。Ver.5.5以降はcurlfileを使う必要があった様です。

<?php
  $curl = curl_init();
  $api_url = 'http://whatcat.ap.mextractr.net/api_query';
  // $params = array('image' => '@'.$_FILES["file"]["tmp_name"]);

  $cfile = new CURLFile($_FILES["file"]["tmp_name"],'image/jpeg','test_name');
  $params = array('image' => $cfile);

  curl_setopt($curl, CURLOPT_URL, $api_url);
  curl_setopt($curl, CURLOPT_USERPWD, "hoge:hoge");
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data'));
  curl_setopt($curl, CURLOPT_POST, true);
  curl_setopt($curl, CURLOPT_POSTFIELDS, $params );
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

  echo('<pre>');
  var_dump("params:".print_r($params,true));
  echo('</pre>');

  $data = curl_exec($curl);
  curl_close($curl);

  $res = json_decode($data);

  echo('<pre>');
  var_dump("res:".print_r($res,true));
  echo('</pre>');

  var_dump($res[0][0]);
?>

実行結果

string(197) "params:Array
(
    [image] => CURLFile Object
        (
            [name] => /Applications/MAMP/tmp/php/phpcULeAH
            [mime] => image/jpeg
            [postname] => test_name
        )

)
"
string(550) "res:Array
(
    [0] => Array
        (
            [0] => Brazilian_Shorthair
            [1] => 0.99639326334
        )

    [1] => Array
        (
            [0] => Japanese_Bobtail
            [1] => 0.00310319010168
        )

    [2] => Array
        (
            [0] => Arabian_Mau
            [1] => 0.000475891894894
        )

    [3] => Array
        (
            [0] => Aegean_cat
            [1] => 2.01569600904E-5
        )

    [4] => Array
        (
            [0] => Oriental_cat
            [1] => 2.16154967347E-6
        )

)
"
string(19) "Brazilian_Shorthair"

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る