【问题标题】:multipart/form-data csv file upload POST PHP curlmultipart/form-data csv 文件上传 POST PHP curl
【发布时间】:2017-10-14 21:57:58
【问题描述】:

我正在尝试使用 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 命令很好。

谢谢。

【问题讨论】:

    标签: php wordpress curl post multipartform-data


    【解决方案1】:

    构造$data变量时不要使用http_build_query

    来自文档:

    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,可以禁用 @ 前缀以安全传递以 @ 开头的值。

    【讨论】:

    • 感谢您的回复!但是似乎我必须使用 http_build_query 或 json_encode 因为当我尝试不使用它时,我收到一条错误消息,指出格式无效。
    • 从终端运行时得到什么响应?
    • 当我从终端运行它时,它正常工作,文件被上传,就是这样,一条成功消息。问题出在我的 php 代码中。
    • 我的意思是如果你从终端运行 php 文件
    • 哦,对不起,我误解了你的问题。从网页运行时我得到的响应是一样的:“错误处理来自 http 请求的数据”
    猜你喜欢
    • 2015-09-19
    • 1970-01-01
    • 2018-04-08
    • 2011-02-12
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多