2011-06-21 46 views
0

我想在我的网站上的窗体上上传文件,然后将它传递给远程API。PHP cURL:从窗体上传文件到远程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

您的API是否有文档?他们应该告诉你如何使用cURL – Ibu

+0

不确定,但是在php.ini中是否有设置来启用curl?检查phpinfo()以查看它是否启用。 – Eamorr

回答

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。根据手册,它可以是一个数组()直接。

CURLOPT_POSTFIELDS在HTTP“POST”操作中将完整数据发送到 。若要 发布文件,请在文件名前添加@ 并使用完整路径。文件类型 可以通过 以类型 的格式为'; type = mimetype'的文件名明确指定。此 参数可以作为 urlencoded的字符串等 “PARA1 = VAL1 & PARA2 = val2的& ...”或传递作为 阵列与现场名作为值作为密钥和 场数据。如果值是 数组,则Content-Type标头将设置为 ,设置为multipart/form-data。从PHP 5.2.0开始,通过@前缀传递给此选项的文件必须以 数组的形式工作。

+1

为了让你的例子适用于OP的情况,你需要''file'=>'@'。 $ _FILES ['mediaupload'] ['tmp_name']',将CURL指向放置在其服务器上的临时文件。 –

+0

非常有帮助,我只是想发表类似的问题。因此,我可以使用临时路径并同时指定一个mime类型(如在'file'=>'@'中。$ _ FILES ['mediaupload'] ['tmp_name']。'; type ='。$ _ FILES ['mediaupload'] ['type'];? – Vasea