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

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

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

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

PHP

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

Q&A

解決済

1回答

1757閲覧

PHP cURLでbase64を複合したファイルを送信したい

退会済みユーザー

退会済みユーザー

総合スコア0

cURL

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

PHP

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

0グッド

0クリップ

投稿2020/06/21 19:08

編集2020/06/22 06:31

やりたいこと

base64にエンコードされたファイルを複合してcURLで送信したい。
→下記のサンプルコードから@1をコメントインした状態

試したこと

  1. 下記のサンプルコードでは成功することを確認しています。
  2. @1の行をコメントインすると@2で 「ERROR:3 No URL set!」が出てしまいます。
  3. @1を「file_put_contents('test.jpg', $file);」すると正しく画像ファイル化されます=base64化されたtest.jpgは正常

わからないこと

「試したこと2」でなぜ「ERROR:3 No URL set!」が出てしまうのか。
「試したこと2」でfopenした場合と同様にする場合の実装方法

php

1<?php 2 3 $file = fopen('test.jpg', "r"); 4 //$file = base64_decode('{base64化されたtest.jpg}'); //@1 5 6 $headers = array( 7 'Accept: application/json', 8 ); 9 10 $options = array( 11 CURLOPT_PUT => true, 12 CURLOPT_INFILE => $file, 13 CURLOPT_URL => 'https://example.com', 14 CURLOPT_RETURNTRANSFER => true, 15 CURLOPT_HTTPHEADER => $headers, 16 ); 17 18 $curl = curl_init(); 19 curl_setopt_array($curl, $options); 20 curl_exec($curl); 21 22 if(curl_errno($curl)) { 23 echo 'ERROR:'.curl_errno($curl).' '.curl_error($curl); //@2 24 }

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

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

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

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

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

otn

2020/06/22 03:48

「複合化」って、何かと思った。「復号」ですね。
退会済みユーザー

退会済みユーザー

2020/06/22 06:26

複合化は誤用なのですね。勉強になりました。 でも「何かと思った」は盛りすぎです。
otn

2020/06/22 09:10

まだ間違えてますよ。 「復号化」ならよくある誤用ですが、「複合化」はそれはそれで意味のある言葉なので。
guest

回答1

0

ベストアンサー

まずはPHPマニュアルを確認して仕様を把握してください。

「試したこと2」でなぜ「ERROR:3 No URL set!」が出てしまうのか。

curl_setopt

value はストリームリソース(例えば fopen() が作成するもの)であり、以下の option パラメータに設定します。

オプション value に設定する内容
CURLOPT_FILE 転送内容が書き込まれるファイル。デフォルトは STDOUT (ブラウザウィンドウ)。
CURLOPT_INFILE アップロード時に転送内容を読み込むファイル。

この辺りを読むと、ただの文字列である base64_decode('{base64化されたtest.jpg}');の結果は設定できないであろうことがわかります。

「試したこと2」でfopenした場合と同様にする場合の実装方法

  • base64した結果を一度適当なファイルとして保存してからそれをfopenする
  • base64したのであればそれはただの文字列なので、文字列として送信する

のどちらかになります。

投稿2020/06/21 19:42

tanat

総合スコア18713

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

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

退会済みユーザー

退会済みユーザー

2020/06/22 02:35

回答いただきありがとうございます。 なるほど、fopenした場合と「base64_decode('{base64化されたtest.jpg}');」は違うのですね。同じバイト数なので同様に見えましたが確かにイコールではありませんでした。 対策としてはやはり一度ファイルとして保存するしかないでしょうか? (わけあってbase64でもらう流れの処理につき、一度保存するのが非効率に思えてしまって、、)
tanat

2020/06/22 02:44

> なるほど、fopenした場合と「base64_decode('{base64化されたtest.jpg}');」は違うのですね。同じバイト数なので同様に見えましたが確かにイコールではありませんでした。 中身がどうというより、PHPから見た場合に入力ストリームと文字列は別物なので同じようには扱えないという事ですね。 > 対策としてはやはり一度ファイルとして保存するしかないでしょうか? 回答にも書きましたが、base64化している文字列を文字列として送ってしまえばいいです。 (PHP curl put あたりをキーワードにして調べてみてください) よくわからないのであれば一時保存するのでも別に良いと思いますよ。
退会済みユーザー

退会済みユーザー

2020/06/22 06:29

なるほど、入力ストリームがなんとなくわかりました。 送信先はオブジェクトストレージなので、一時保存をすることにしました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問