PHP cURL:从表单上传文件到远程API?

时间:2011-06-21 15:53:33

标签: php file-upload

我正在尝试在我的网站上的表单上传文件,然后将其传递给远程API。

这是我的PHP:

$fields = array(
    'file'=>$_FILES["mediaupload"],
    'username'=>urlencode($_POST["username"]),
    'password'=>urlencode($_POST["password"]),
    'latitude'=>urlencode($_POST["latitude"]),
    'longitude'=>urlencode($_POST["longitude"]),
);
$fields_string = http_build_query($fields);
$url = my_url;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec ($ch);

目前我不断收到错误消息,指出文件无法正常处理。 API期望所有字段都作为POST字符串,除了文件,它在二进制文件中期望。

我知道如果没有访问远程API的话,调试这个很难,但是我做了什么显然错误,或者这应该有用吗?

非常感谢。

1 个答案:

答案 0 :(得分:5)

使用curl上传文件不会像这样工作。您需要先使用php move_uploaded_file在本地保存文件,然后获取文件路径。在字段中添加此内容,

$fields = array(
    'file'=>"@/path/to/myfile.ext",
    'username'=>urlencode($_POST["username"]),
    'password'=>urlencode($_POST["password"]),
    'latitude'=>urlencode($_POST["latitude"]),
    'longitude'=>urlencode($_POST["longitude"]),
);

另外, 我不确定是否需要将字段数组转换为字符串以用作postfields。根据手册,它可以直接使用array()。

  

CURLOPT_POSTFIELDS完整数据   在HTTP“POST”操作中发布。至   发布文件,在文件前添加@   并使用完整的路径。文件类型   可以明确指定   跟随文件名的类型   格式为'; type = mimetype'。这个   参数可以作为传递   urlencoded字符串就像   'para1 = val1& para2 = val2& ...'或作为   数组,字段名称为键和   字段数据作为值。如果价值是   数组,Content-Type标题将是   设置为multipart / form-data。截至PHP   5.2.0,使用@前缀传递给此选项的文件必须在   数组形式工作。