【问题标题】:Posting a form with several form fields and file using PHP curl使用 PHP curl 发布具有多个表单字段和文件的表单
【发布时间】:2014-05-07 16:50:05
【问题描述】:

我正在尝试将带有一些文本输入字段的表单发布到我的 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 模板中的所有表单字段作为 post 变量,但我没有得到文件。

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

许多论坛建议使用 '@'.$filename 格式提交文件,但根据 PHP 文档,这似乎已被弃用。我在 PHP 5.5 上,建议上传文件的方法是形成一个 CURLFile 对象,这就是我在这里所做的。 任何人都可以建议上面的代码有什么问题吗?

【问题讨论】:

    标签: php file curl multipartform-data


    【解决方案1】:

    看起来你的方法很完美,但有一个愚蠢的错误。 您可以尝试添加额外的标头信息。希望它会起作用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      相关资源
      最近更新 更多