【发布时间】: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