使用PHP curl发布包含多个表单字段和文件的表单

使用PHP curl发布包含多个表单字段和文件的表单,php,file,curl,multipartform-data,Php,File,Curl,Multipartform Data,我试图将一个带有文本输入字段的表单发布到api中,同时我还想将文件上载到服务器。我做了一些研究,并根据各种网站的建议,提出了以下代码,但它似乎不起作用 第一种方法: $cfile = new CURLFile('/home/xyz/myimge.jpg', 'image/jpeg', 'mymage.jpg'); $params = array( "userid_id" => "some id #", "file" => $cfile, "name" => "t

我试图将一个带有文本输入字段的表单发布到api中,同时我还想将文件上载到服务器。我做了一些研究,并根据各种网站的建议,提出了以下代码,但它似乎不起作用

第一种方法:

 $cfile = new CURLFile('/home/xyz/myimge.jpg', 'image/jpeg', 'mymage.jpg');

 $params = array(
 "userid_id" => "some id #",
  "file" => $cfile,
  "name" => "test_file",
  "gallery" => "myalbum"
  );

 $uri = 'http://myserver.com/somedir/';
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $uri);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true ); 
  curl_setopt($ch, CURLOPT_POST, true );
  curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

  $response_data = curl_exec($ch);

  //var_dump(curl_getinfo($ch));

  //var_dump($response_data);
  curl_close( $ch );
  unset( $ch );
$cfile = new CURLFile('/home/xyz/myimge.jpg', 'image/jpeg', 'mymage.jpg');

$params = array(
 "userid_id" => "some id #",
  "name" => "test_file",
  "gallery" => "myalbum"
  );

$params = array('item' => http_build_query($params), 'file' => $cfile );


  $uri = 'http://myserver.com/somedir/';
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $uri);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true ); 
  curl_setopt($ch, CURLOPT_POST, true );
  curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

  $response_data = curl_exec($ch);

  //var_dump(curl_getinfo($ch));

  //var_dump($response_data);
  curl_close( $ch );
  unset( $ch );
第二种方法:

 $cfile = new CURLFile('/home/xyz/myimge.jpg', 'image/jpeg', 'mymage.jpg');

 $params = array(
 "userid_id" => "some id #",
  "file" => $cfile,
  "name" => "test_file",
  "gallery" => "myalbum"
  );

 $uri = 'http://myserver.com/somedir/';
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $uri);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true ); 
  curl_setopt($ch, CURLOPT_POST, true );
  curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

  $response_data = curl_exec($ch);

  //var_dump(curl_getinfo($ch));

  //var_dump($response_data);
  curl_close( $ch );
  unset( $ch );
$cfile = new CURLFile('/home/xyz/myimge.jpg', 'image/jpeg', 'mymage.jpg');

$params = array(
 "userid_id" => "some id #",
  "name" => "test_file",
  "gallery" => "myalbum"
  );

$params = array('item' => http_build_query($params), 'file' => $cfile );


  $uri = 'http://myserver.com/somedir/';
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $uri);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true ); 
  curl_setopt($ch, CURLOPT_POST, true );
  curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

  $response_data = curl_exec($ch);

  //var_dump(curl_getinfo($ch));

  //var_dump($response_data);
  curl_close( $ch );
  unset( $ch );
根据文档,将数组传递给CURLOPT_POSTFIELDS将把数据编码为多部分/表单数据。我应该将我的表单字段作为$\u POST数组,将上传的文件作为$\u FILES数组。使用这两种方法,我将接收php模板中的所有表单字段作为post变量获取,但我没有获取文件

当我检查ccurl_getinfo输出的内容类型时,我看到它是: [“内容类型”]=> 字符串(9)“文本/html” 而不是文档中建议的“多部分/表单数据”。使用curl_setopt将content_类型显式设置为“multipart/form data”也没有任何效果

许多论坛建议使用“@.”$filename格式提交文件,但根据PHP文档,这似乎是不推荐的。我使用的是PHP5.5,建议上传文件的方法是形成一个CURLFile对象,这就是我在这里所做的。
有人能指出上面代码中的错误吗?

似乎您的方法是完美的,但有一个愚蠢的错误。 您可以尝试添加额外的标题信息。希望它能起作用

$headers = array("Content-Type:multipart/form-data"); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);