前提
PHP(ver 7.4.13)を使ってWebAPIのテストを実施しています。
フォームで取得したCSVファイルをcurlを使ってPOSTしたいのですがうまくいきません。
具体的には、下記ソースコードおよび試したことをご確認いただけますでしょうか。
※URLやjsonおよびパスワード等はサンプルデータになります。分かりにくく申し訳ございません。
実現したいこと
APIリクエストを成功させたい。
該当のソースコード
PHP
1// フォームデータよりファイルを取得 2$file = $_FILES['file']; 3$path = "tmp/".$file["name"]; 4 5$url = "https://example.com/hoge/" 6$json = ["pass"=>"xxxx", 7"id"=>"hogehoge", 8"send_file"=>"send_file"]; 9$data = json_encode($json); 10$headers = array( 11 "Authorization: xxxxxxxx", 12 "Content-Type: application/json", 13 ); 14 15$ch = curl_init(); 16curl_setopt($ch, CURLOPT_URL, $url); 17curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 18curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 19// ファイルを送付したい(ここに原因があると想定) 20$curl_file = new CURLFile($path); 21$files = ["file" => $curl_file,]; 22$json_files = json_encode($files); 23curl_setopt($ch, CURLOPT_POSTFIELDS, $json_files); 24 25curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 26curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 27 28$html = curl_exec($ch); 29$html = mb_convert_encoding($html,"UTF-8","UTF-8"); 30var_dump($html)."<br>"; 31curl_close($ch); //終了
発生している問題・エラーメッセージ
エラーメッセージ string(22) "Authentication Failed
試したこと
ファイル添付をしない形式での他のAPIリクエストは問題なく成功しており、$url,$json,$header等に原因があることは考えにくいと思っています。
試したこと①
下記のようにした場合は、HTTPリクエスト自体は正常にされていて、その他のjsonデータは問題なくPOSTされています。
また、「CSVファイルがないよ」といったAPIアプリ側で定義されているエラーコードが確認できています。
PHP
1// ファイルを送付する 2$curl_file = new CURLFile($path); 3$files = ["file" => $curl_file,]; 4$json_files = json_encode($files); 5// curl_setopt($ch, CURLOPT_POSTFIELDS, $json_files);
エラーメッセージ string(78) "{ "errors" : [ { "code" : "E0001", "message" : "send_file" } ] } "
つまり、「該当のソースコード」では認証エラーとなっていますが、
パスワード等が誤っている可能性は低いと考えております。
試したこと②
また、下記のようにjson_encodeをしなかった場合は、
JSON Format InvalidとしてJSON形式が無効といったエラーが返ってきます。
PHP
1// ファイルを送付する 2$curl_file = new CURLFile($path); 3$files = ["file" => $curl_file,]; 4// $json_files = json_encode($files); 5curl_setopt($ch, CURLOPT_POSTFIELDS, $files);
エラーメッセージ string(1648) "JSON Format Invalid: Unexpected character ('-' (code 45)) in numeric value: expected digit (0-9) to follow minus sign, for valid numeric value at [Source: --------------------------679423fc591a0c09 Content-Disposition: attachment; name="file"; filename="tmp/sample.csv" Content-Type: application/octet-stream アドレス,名前 …" NULL
補足情報
情報が不足しているかもしれませんので、その際はご指摘いただけますと幸いです。
また、前提知識に問題がある場合はお手数ですが、そちらについてもご指摘ください。
何卒宜しくお願い致します。
あなたの回答
tips
プレビュー