如何使用PHP Curl发送表单字段和文件?

如何使用PHP Curl发送表单字段和文件?,php,curl,Php,Curl,我正在尝试使用php curl将表单字段和文件发送到web服务。表单已经从浏览器传递到代理php客户端web应用,我正在尝试将其转发到web服务 当我将数组传递给curl_setopt时,如下所示: curl\u setopt($this->ch,CURLOPT\u POSTFIELDS,$this->fields) 我得到了一个要字符串的数组,尽管它是用来获取数组的。这是传递给构造函数中$this->fields的数组 $fields = array('title'=>$title, '

我正在尝试使用php curl将表单字段和文件发送到web服务。表单已经从浏览器传递到代理php客户端web应用,我正在尝试将其转发到web服务

当我将数组传递给curl_setopt时,如下所示:

curl\u setopt($this->ch,CURLOPT\u POSTFIELDS,$this->fields)

我得到了一个要字符串的数组,尽管它是用来获取数组的。这是传递给构造函数中$this->fields的数组

$fields = array('title'=>$title,
'content'=>$content,
'category'=>$category,
'attachment'=>$_FILES['attachment']);
如果我使用
http\u build\u query
传递字符串,我的web服务会抱怨没有多部分/表单数据

如果我随后使用
curl\u setopt
强制使用多部分/表单enctype,我会得到一个错误,说没有边界:

org.apache.commons.fileupload.FileUploadException:请求被拒绝,因为找不到多部分边界


有什么想法吗?

使用下面的代码显示要字符串的数组通知:

$fields = array(
  'title'=>$title,
  'content'=>$content,
  'category'=>$category,
  'attachment'=>$_FILES['attachment']
);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $fields);
这不是因为您将数组作为第三个参数传递给curl_setopt:而是因为您将数组传递给
附件


如果要以这种方式传递文件,应传递其绝对路径,在其前面预先挂起一个
@

$fields = array(
  'title'=>$title,
  'content'=>$content,
  'category'=>$category,
  'attachment'=> '@' . $_FILES['attachment']
);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $fields);
(这是假设
$\u FILES['attachment']
包含文件的完整路径——如果需要,由您更改此代码以使其使用正确的数据)


作为参考,引用的手册页,对于
CURLOPT_POSTFIELDS
选项:

要在HTTP“post”操作中发布的完整数据。
要发布文件,请在文件名前面加上
@
并使用完整路径。

这可以作为urlencoded字符串(如
'para1=val1¶2=val2&…')传递,也可以作为字段名为键、字段数据为值的数组传递。

如果值是数组,则
内容类型
标题将设置为
多部分/表单数据

试试这个

$filePath = "abc\\xyz.txt";         

$postParams["uploadfile"] = "@" . $filePath;


        $ch = curl_init();
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_URL, 'https://website_address');
        curl_setopt($ch, CURLOPT_POST, 1 );
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postParams);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $response = curl_exec($ch);

        if (curl_errno($ch))
            {
                echo curl_error($ch);               
                exit();                         
            }
        curl_close($ch);

谢谢,我现在用@传递文件名,但仍然得到多部分边界错误。