我尝试从远程位置检索并下载文件(图像)。 在php.ini中启用allow_url_fopen,但我无法下载图像。 代码i使用如下所述
$local_file = "test.jpg";
$remote_file = "http://somehost:6346/cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=xxxx&pwd=xxxx";
$ch = curl_init();
$fp = fopen ($local_file, 'w+');
$ch = curl_init($remote_file);
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_exec($ch);
curl_close($ch);
fclose($fp);
与任何其他包含真正的jpg文件的网址,它运行正常,我想问题是网址使用了一些不喜欢卷曲的特殊字符。 如果我尝试执行上面的php片段,页面加载差不多1分钟,似乎没有显示错误,则会创建图像test.jpg,但它是空的。 你有什么建议吗? 谢谢!
答案 0 :(得分:0)
试试这个
$local_file = "test.jpg";
$remote_file = "http://somehost:6346/cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=xxxx&pwd=xxxx";
function getPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
function saveToFile($base, $decode=false, $output_file)
{
$ifp = fopen($output_file, "wb");
if ($decode){
fwrite($ifp, base64_decode($base));
}else{
fwrite($ifp, $base);
}
fclose($ifp);
return($output_file);
}
$remote_page = getPage($remote_file);
$saved_file = saveToFile($remote_page , false, $local_file);
答案 1 :(得分:0)
当调试这样的问题时,设置CURLOPT_VERBOSE,它可能会显示为什么页面加载了差不多1分钟,没有明显的输出。
i suppose that the issue is that the url use some special characters
- 完全有可能,例如您的用户名和密码,它们应该是urlencoded。 urlencoding是二进制安全的,这意味着你可以拥有任何你喜欢的特殊字符,你只需要正确编码即可。使用urlencode()或http_build_query(),例如
$remote_file = "http://somehost:6346/cgi-bin/CGIProxy.fcgi?" . http_build_query ( array (
'cmd' => 'snapPicture2',
'usr' => 'username',
'pwd' => 'password'
) );
现在http_build_query会正确地对您的用户名和密码中的任何特殊字符进行网址编码(例如,如果您的用户名是电子邮件地址,则@
会变为%40
)。
另外,最后请注意,此处您正在使用GET请求中的凭据发送下载请求。这是非常不寻常的,绝大多数网站都希望您使用POST请求登录,而there are good security-related reasons for that,您确定您的网站允许在GET参数中发送凭据吗?绝大多数网站都不允许......(最好的方法是记录登录的浏览器,浏览器是否使用GET参数或POST参数?)