multipart / form-data csv文件上传POST PHP curl

时间:2017-10-14 21:57:59

标签: php wordpress curl post multipartform-data

我正在尝试使用PHP和curl通过http POST发送文件。

使用基本字段时没有问题,但是因为我试图上传文件,所以我仍然没有运气。

从终端我可以轻松地使用以下命令:

curl --header 'Content-Type: multipart/form-data' --header 'auth-token: #.######.##.##########################' -F 'file=@test_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

我尝试在php中使用以下内容:

$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类来代替文件的@,但它给了我同样的错误。

我认为值得一提的是我在Wordpress插件中运行此代码。

我想知道我的php代码出了什么问题,因为curl shell命令没问题。

谢谢。

1 个答案:

答案 0 :(得分:0)

构建http_build_query变量

时不要使用$data

来自文档:

CURLOPT_POSTFIELDS

要在HTTP" POST"中发布的完整数据操作。要发布文件,请在文件前加上@并使用完整路径。可以通过使用格式为'; type = mimetype'的类型的文件名来明确指定文件类型。此参数可以作为urlencoded字符串传递,例如' para1 = val1& para2 = val2& ...'或者作为一个数组,字段名称为键,字段数据为值。如果value是数组,则Content-Type标头将设置为multipart / form-data。从PHP 5.2.0开始,如果使用@前缀将文件传递给此选项,则value必须是数组。从PHP 5.5.0开始,不推荐使用@前缀,可以使用CURLFile发送文件。通过将CURLOPT_SAFE_UPLOAD选项设置为TRUE,可以禁用@前缀以安全传递以@开头的值。