我正在尝试在我的网站上的表单上传文件,然后将其传递给远程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的话,调试这个很难,但是我做了什么显然错误,或者这应该有用吗?
非常感谢。
答案 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,使用@前缀传递给此选项的文件必须在 数组形式工作。