PHP サーバ上のファイルをAPIなどにPOSTする方法

クライアントからアップロードされたファイルを受け取るのは簡単だが
サーバ上のファイルをAPIなどにPOSTするのは割と面倒い。

いろいろやり方はあると思うけど
CURLFileでのやり方を書きます。

★やりたいこと★

■クライアントからの受け取り

<input type="file" name="client_file" value="client_image.jpg">

■APIへのPOSTイメージ

<input type="file" name="api_file" value="api_image.jpg">

クライアントからアップロードされたファイルをサーバ上に保存せずにそのままAPIに渡す場合は、比較的簡単。

$curl = curl_init();
$api_url = 'APIのURL';   // 絶対URLでないとダメ

$cfile = new CURLFile($_FILES["client_file"]["tmp_name"],'image/jpeg',"api_image.jpg');
$params = array('api_file' => $cfile);

curl_setopt($curl, CURLOPT_URL, $api_url);
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 );

$data = curl_exec($curl);

これだけでOK

クライアントから受け取ってリサイズなどしてファイルを保存して、そのファイルをAPIに渡したい場合。

// アップロードファイル名を取得
$filename = pathinfo($_FILES['client_file']['name'], PATHINFO_EXTENSION);
// アップロードファイルを保存 ※リサイズ処理は割愛
move_uploaded_file($_FILES['client_file']['tmp_name'], "./img/".$filename);

$curl = curl_init();
$api_url = 'APIのURL';   // 絶対URLでないとダメ

$cfile = new CURLFile("xxxxxxg/".$filename, 'image/jpeg', 'api_image.jpg');   // 第一パラメータのアップロードするファイル名は、絶対パスでないとダメ!!
$params = array('api_image' => $cfile);

curl_setopt($curl, CURLOPT_URL, $api_url);
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 );

$data = curl_exec($curl);

■ポイント

curl_setopt()のCURLOPT_URLは、絶対URLでないとダメ!!
CURLFile()の第一パラメータは、アップロードするファイル名 ※絶対パスでないとダメ!!
CURLFile()の第三パラメータは、API側で$_FILES[‘api_file’][‘name’]で取得されるファイル名
$params = array(‘api_file’ => $cfile);のキーは、API側で$_FILESで取得する時のキー

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です