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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

Q&A

解決済

2回答

418閲覧

docomoの画像認識APIで商品情報の取得(PHP)

silksummer

総合スコア18

PHP

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

0グッド

0クリップ

投稿2018/06/25 01:35

docomoの画像認識APIを利用して商品の画像をAPIにリクエストして送信したらその商品情報が返却されるはずなのですが、Content-Typeがうまく設定できていないせいだと思うのですがリクエストでエラーが出てしまいJSONデータが返却されず困っています
誰かphpに詳しい方よろしければ解決方法を教えていただけますでしょうか。

エラー内容としては
"code":"107","message":"The server encountered an error while reading the query image file. The query image may not be valid. Please check its format."docomoAPIのデベロッパーです

PHP

1<?php 2getDocomo(); 3function getDocomo() { 4// var_dump($image); 5 $url = "https://api.apigw.smt.docomo.ne.jp/imageRecognition/v1/recognize?APIKEY=&recog=food&numOfCandidates=16"; 6 $ch = curl_init(); 7 8 $params = [ 9 CURLOPT_URL => $url, 10 CURLOPT_RETURNTRANSFER => true, 11 CURLOPT_POST => true, 12 CURLOPT_SSL_VERIFYPEER =>false, 13 CURLOPT_HTTPHEADER => [ 14 "Content-Type" => "application/octet-stream", 15 ], 16 CURLOPT_POSTFIELDS => [ 17 'image' => new CURLFile('C:/xampp7/htdocs/imagematch/image/20180625094226.jpeg') 18 // 'image' => new CURLFile("{$image}"), 19 ], 20 ]; 21 var_dump($params); 22 23 // curl_setopt($ch, CURLOPT_POST, false); 24 // curl_setopt($ch, CURLOPT_POSTFIELDS, new CURLFile("{$image}")); 25 $result = curl_setopt_array($ch, $params); 26 if ($result){ 27 $output = curl_exec($ch); 28 $info = curl_getinfo($ch); 29 $errno = curl_errno($ch); 30 $error = curl_error($ch); 31 if (CURLE_OK !== $errno) { 32 var_dump($errno); 33 var_dump($error); 34 } 35 }else { 36 $output = "パラメータに誤りがあります"; 37 } 38 var_dump($output); 39 return $output; 40 41} 42 43?>

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

curl $URL -H"Content-Type: application/octet-stream" --data-binary @800x800.png

で実行だから

CURLOPT_BINARYTRANSFER に true(1) を設定しないといけないのでは

投稿2018/06/25 04:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

silksummer

2018/06/25 04:55

設定しましたが同じエラーでした
guest

0

ベストアンサー

提示のマニュアルにあるとおりエラーメッセージは「画像認識において、画像の形式が不正」らしいですが、何か心当たりはありませんか?
コード内で利用しようとしているjpegではダメとか。

投稿2018/06/25 01:44

m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

silksummer

2018/06/25 01:58

心あたりがあまりなくて 拡張子の指定としてはjpegは大丈夫と記述されていたので大丈夫です 学生なので詳しくなくてすいません
m.ts10806

2018/06/25 02:01

謝る必要はありません。 > 拡張子の指定としてはjpegは大丈夫と記述されていた これはどこに書いてあったのでしょうか。 試しに実際に存在するjpg画像にしてはいかがでしょうか? いずれにしてもエラーコードが明示的に返されているのでそこを疑うしかありません。 画像が破損していないかとか、画像で使う拡張子なだけで実体は別の(例えばテキストとかExcelのファイルの拡張子を変更した)だけのファイルとか。
silksummer

2018/06/25 02:21

jpg画像にしてもエラー内容が同じでした 画像が破損している可能性は確かめたのですが破損はしていないようでした 他のサイトなどを参考にしていたのですがcontent-typeがうまく設定できていないとこのエラーがでるみたいなんですが設定でcontent-typeの設定はきちんとしているので理由が分からない感じです
m.ts10806

2018/06/25 02:47

あとはリクエストの画像が「画像データ(バイナリ)」と「バイナリ形式」でないといけないらしいので、 CURLFile()で正しくバイナリになっているか、ですね。 CURLFile()はファイルオブジェクトそのものなので、本来渡すべきバイナリになっていないように思います。
silksummer

2018/06/25 02:59

APIに画像データを渡す方法って他に何かあるのでしょうか? 調べて一番いいものがこの方法だったので何かおすすめのものがあれば教えてもらいたいです
m.ts10806

2018/06/25 03:01 編集

単にPHPでバイナリ化すればいいだけです。 >画像データ(バイナリ) PHP 画像 バイナリ化 で調べてください。PHPに用意されている関数がでてくるはずです。 一応「バイナリデータとは」というところも調べておいてくださいね。
silksummer

2018/06/25 03:20

すこし調べてみます また何かあれば質問してもよろしいでしょうか?
m.ts10806

2018/06/25 03:49

API仕様通りバイナリデータを渡せばいいだけであればすぐに解決できそうに思います。 がんばってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問