2017-10-14 37 views
0

私はPHPとカールを使ってhttp POST経由でファイルを送信しようとしています。multipart/form-data csvファイルアップロードPOST PHPカール

基本的なフィールドでは問題はありませんでしたが、ファイルをアップロードしようとしたので、まだ運がありません。私はPHPで次のように使用してみました

curl --header 'Content-Type: multipart/form-data' --header 'auth-token: #.######.##.##########################' -F '[email protected]_csv.csv' -F 'command=import' -F 'parameters={"contact-list_code": "1", "separator": ",", "header": false, "file_columns": [{"Position":"0", "Field":"1", "Rule":"3"}, {"Position":"1", "Field":"14", "Rule":"3"} ] }' http://api.com/method 

::私は簡単には以下のコマンドで動作するように取得することができ、端末から

$file = '@'.realpath(dirname(__FILE__) . '/exports/test_csv.csv'); 
$data = http_build_query(array(
    "command" => "import", 
    "file" => $file, 
    "parameters" => array(
     "contact-list_code" => "1", 
     "separator" => ",", 
     "header" => false, 
     "file_columns" => array(
      array(
       "Position" => "0", 
       "Field" => "1", 
       "Rule" => "3" 
      ), 
      array(
       "Position" => "1", 
       "Field" => "14", 
       "Rule" => "3" 
      ) 
     ) 
    ) 
)); 
$authToken = '#.######.##.##########################'; 

$serviceHandler = curl_init(); 
curl_setopt($serviceHandler, CURLOPT_URL, 'http://api.com/method'); 
$headers = array(); 
$headers[] = "Content-Type: multipart/form-data"; 
$headers[] = "Auth-Token: ".$authToken; 

curl_setopt($serviceHandler, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($serviceHandler, CURLOPT_POST, TRUE); 
curl_setopt($serviceHandler, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($serviceHandler, CURLOPT_POSTFIELDS, $data); 
curl_setopt($serviceHandler, CURLOPT_HTTPHEADER, $headers); 

print_r(json_decode(curl_exec($serviceHandler))); 

ここに私が受信したエラーです:Error handling data from http request

は、

私はファイルの@の代わりにファイルのためにCURLFileクラスを使ってみましたが、それは私に同じerを与えましたror。

私はWordpressのプラグインの中でこのコードを実行していることに言及する価値はあると思います。

私のPHPコードで何がうまくいかないのは、curlシェルコマンドがうまくいきません。

ありがとうございます。

CURLOPT_POSTFIELDS

HTTP "POST" で送信するには、完全なデータ:ドキュメントから$data変数

を構築する際に

答えて

0

いけないhttp_build_queryを使用しています。ファイルを投稿するには、ファイル名の前に@を付け、完全なパスを使用します。 filetypeは、 '; type = mimetype'の形式のファイル名の後に明示的に指定することができます。このパラメータは、 'para1 = val1 & para2 = val2 & ...'のようなURLエンコードされた文字列として渡すか、キーとしてのフィールド名と値としてのフィールドデータを持つ配列として渡すことができます。 valueが配列の場合、Content-Typeヘッダーはmultipart/form-dataに設定されます。 PHP 5.2.0以降、このオプションに@接頭辞を付けてファイルを渡す場合、値は配列でなければなりません。 PHP 5.5.0以降、@接頭辞は推奨されず、CURLFileを使用してファイルを送信することができます。 @接頭辞は、CURLOPT_SAFE_UPLOADオプションをTRUEに設定することで、@で始まる値を安全に渡すために無効にすることができます。

+0

返信いただきありがとうございます!しかし、http_build_queryまたはjson_encodeを使用する必要があるようですが、私はそれを試してみると、フォーマットが無効であるというエラーが表示されるためです。 –

+1

端末から実行したときにどのような応答が得られますか? – miknik

+0

端末から実行すると、正常に動作します。ファイルはアップロードされ、それが成功メッセージです。問題は私のPHPコードのどこかにあります。 –

関連する問題