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

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

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

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

PHP

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

Q&A

解決済

2回答

7269閲覧

PHP:cURLで指定画像をエンコードタイプがmultipartのpostをしたい

Kazuma2015

総合スコア46

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

PHP

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

0グッド

0クリップ

投稿2016/09/21 08:17

編集2016/09/21 09:39

HTMLから受け取った画像データAを解析中のapiにpostする処理をしています。
apiに送る画像データはエンコードタイプがmultipartです。
charlesを使用して解析しているapiのpost結果を見てみると

Content-Disposition: form-data; name="photo_1"; filename="photo_1.jpg" Content-Type: image/jpeg ~~~~以下データ内容~~~~~~~~~~~~~~~~~~~~~~~

となっています。

そこで

PHP

1// (main)---------------------------------------------- 2$headers = array( 3"Content-Type: multipart/form-data", 4 ); 5$data = array( 6'photo_1' => base64_encode(file_get_contents($upload_img)) 7 ); 8$result = PostCURL(https://example.api.com/v1/upload?_access_token=XXXXXXXX’, $data, $headers); 9 10// (postcurl)------------------------------------------ 11function PostCURL($URL,$data,$headers){ 12 $ch = curl_init(); 13 14 curl_setopt($ch, CURLOPT_URL,$URL); 15 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); 16 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 17 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 18 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 19 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 20 curl_setopt($ch, CURLOPT_USERAGENT,$USER_AGENT); 21 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 22 curl_setopt($ch, CURLOPT_VERBOSE, true); 23 24 $response = curl_exec($ch); 25 $result = json_decode($response, true); 26 $errno = curl_errno($ch); 27 $error = curl_error($ch); 28 curl_close($ch); 29 30 return $result; 31}

と組んだのですが写真が正常にアップロードされませんでしたと返ってきます。

たぶん'photo_1' => base64_encode(file_get_contents($upload_img))の部分が引っかかっているように思えます。(file_get_contentsを使うと画像がmultipartじゃなくなるような気がする)
以上ご教授お願いします。

<追記>
apiのurlは
https://api.axluse.com/v1/jp/
です。

ロジックは画像のデーモンファイルとやらをapiで自動生成してくれるものです。

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

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

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

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

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

kunai

2016/09/21 08:29

「写真が正常にアップロードされませんでした」というエラーを返している側のコードを提示いただけませんか? どういう条件でそのメッセージが返っているのかを確認したいのですが。
Kazuma2015

2016/09/21 08:44

当方ではapiのコードは持ち合わせていないので一通りやれる方法を片っ端からやっていくつもりです。 現行の調査の段階で分かっていることとして、 ・エンコードタイプはmultipart ・upload可能画像データは縦横612pxのjpgのみ ・imgのContent-Typeはimage/jpeg ・imgのname="photo_1";filename="photo_1.jpg"固定 ・Boundary形式が使われている 以上5点です。 これらに相当するpostの方法を知っているだけ教えていただければ試してみてその結果を見ながら解析していきたいです。
kunai

2016/09/21 08:57

利用するAPIの仕様書的なモノもないという事ですか? それは正規に利用権限のあるAPIなのでしょうか。。
Kazuma2015

2016/09/21 09:05

apiのサーバーは稼動していますが、著作主はapiを自由に解析して使ってもいいと明記されているだけのapiです。apiサーバー側はphp5.1のみ記載があります。 ちなみにイギリスのサーバーなのでpostできないとか...あるんでしょうかね...
Kazuma2015

2016/09/21 09:06

書き忘れましたが仕様書は一切ありません。
kunai

2016/09/21 09:09

自由に使っていいのであれば、そのURLを教えていただけますか
Kazuma2015

2016/09/21 09:12

>イギリスのサーバーなのでpostできない 訂正します。画像のデータのみpostがうまくいっていないようです。画像データを送らないコンテンツはうまく送信できているようなのですが、やはり画像データのpost方法が間違っているようです。
kunai

2016/09/21 09:20

apiのRequestを発行するURLではなく、最低限の説明のあるページが見たいのですが、そういうのはないのでしょうか。
Kazuma2015

2016/09/21 09:22

メールのみでの対応になっていると思います。 info@axluse.comで質疑が聞けると思います。
kunai

2016/09/21 09:29

すみません、どうにも怪しいので降ります。度々対応いただいたのにすみません。他の回答者さんを待つか、そのメールアドレス宛に質問してください。
Kazuma2015

2016/09/21 09:34

いえいえ、ありがとうございます。こちらも興味があったのでやっているような感じなので(笑 どうもありがとうございました
guest

回答2

0

自己解決

完全に見落としていました。
ヘッダーの設定項目に画像を投稿する際にはAPPNAMEを記載するように書かれていました。
これで解決です。

投稿2016/09/27 00:03

Kazuma2015

総合スコア46

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

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

0

1.jpgと2.jpgをexsample.com/getfile.phpにおくる場合

PHP

1$ch = curl_init(); 2$url="http://exsample.com/getfile.php"; 3curl_setopt_array($ch, [ 4 CURLOPT_URL => $url, 5 CURLOPT_POST => true, 6 CURLOPT_POSTFIELDS => [ 7 'myfile[0]' =>new CURLFile("1.jpg","image/jpeg"), 8 'myfile[1]' =>new CURLFile("2.jpg","image/jpeg"), 9 ], 10 ]); 11ob_start(); 12curl_exec($ch); 13$str=ob_get_contents(); 14ob_end_clean(); 15curl_close($ch); 16print $str; //必要なら戻り値を表示する 17

投稿2016/09/21 09:46

yambejp

総合スコア114779

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

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

Kazuma2015

2016/09/23 07:22

回答ありがとうございます。 上記のスクリプトで動作してみましたが、未だ画像のアップロードに失敗しています。 他の方法を試してみます
yambejp

2016/09/23 07:34

そもそもそのサーバーから指定のURLへの経路は確保されているのでしょうか? サーバーによっては直接接続できない設定になっているものもあります 試しにget_contentsで接続データを取りにいってみてください 直接接続がだめな場合でもプロクシ経由でアクセスできるかもしれません。 ご利用のサーバー環境の管理者に開放されたプロクシがあるか確認してみてください
Kazuma2015

2016/09/23 10:58

ローカル環境にファイル投稿cgiを仮に設計し、同じようにcURLを使用した方法でpostした結果は画像データのやり取りが正常に動いています。 運営側のサーバーでただ拒否されているのかと思い、charlesを使ってpostするとうまくできているんですよね.... >get_contentsで接続データを取りにいってみて file_get_contentsをbase64encodeしたものを自鯖に送ってみたら正常にpostされました。画像データをdecodeすることもできましたし、データも壊れていません。 しかし、urlをapi側に設定しなおすとsslエラーになります。 あちらのapiはssl通信なのでたぶんfile_get_contentsで取得できないのかも(?※記憶があやふやです)しれません。
Kazuma2015

2016/09/23 10:59

proxyの存在は今確認中です。たぶん返信まで数日かかる見込みです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問