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

时间:2014-05-07 16:50:05

标签: 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" => "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会将数据编码为multipart / form-data。我应该将我的表单字段作为$ _POST数组,并将上传的文件作为$ _FILES数组。使用这两种方法,我在接收php模板中获取所有表单字段作为后期变量,但我没有得到该文件。

当我检查ccurl_getinfo输出的content_type时,我看到它是: [" CONTENT_TYPE"] =>   string(9)" text / html" 而不是" multipart / form-data"正如文档中所建议的那样。将content_type显式设置为" multipart / form-data"使用curl_setopt也没有任何效果。

许多论坛建议使用'。'。文件名格式来提交文件,但根据PHP文档,这似乎已被弃用。我在PHP 5.5上,建议上传文件的方法是形成一个CURLFile对象,这就是我在这里做的。 任何人都可以在上面的代码中提出错误吗?

1 个答案:

答案 0 :(得分:0)

似乎你的方法很完美,但有一个愚蠢的错误。 您可以尝试添加额外的标头信息。希望它能奏效。

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