使用PHP curl发布包含多个表单字段和文件的表单
我试图将一个带有文本输入字段的表单发布到api中,同时我还想将文件上载到服务器。我做了一些研究,并根据各种网站的建议,提出了以下代码,但它似乎不起作用 第一种方法:使用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
$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);