PHP cURL:绕过'@'表示文件POST

时间:2014-03-03 15:57:30

标签: php curl

我正在尝试制作一个cURL帖子,其中一个参数包含一个前缀为“@”符号的字符串。通常对于cURL帖子,'@'表示我正在尝试发布文件,但在这种情况下,我只想传递前缀为'@'的字符串。有没有办法,或者最好的办法是什么?

这是我的params数组:

$params = array(
        'UserID'       => $this->username,
        'Password'     => $this->password,
        'Type'         => $type,
        'Symbol'       => $symbol, // this will look something like @CH14
        'Market'       => '',
        'Vendor'       => '',
        'Format'       => 'JSN'
);

以下是我的cURL帖子的发布方式(网址与实际问题无关。):

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

// Return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

$response = curl_exec($ch);

if($response === FALSE)
{
    $error = curl_error($ch);
    $error_code = curl_errno($ch);
    throw new Exception("CURL ERROR: #$error_code\n$error\n");
}

curl_close($ch);

return $response;

这适用于我需要它做的一切,除非我需要在前面传递一个带有'@'的符号。任何帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:3)

根据curl_setopt() manual entry

  

<强> CURLOPT_POSTFIELDS

     

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

因此,我们可以使用http_build_query()简单地将其转换为字符串:

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));

答案 1 :(得分:1)

使用http_build_query()构建查询字符串。

从功能文档:

  

从提供的关联(或索引)数组生成 URL编码的查询字符串。

如上所述,它将根据需要正确编码所有特殊字符。它可以使用如下:

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));

Online demo