来自url的curl和php下载文件无法正常工作

时间:2018-02-18 08:29:07

标签: php curl

我尝试从远程位置检索并下载文件(图像)。 在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,但它是空的。 你有什么建议吗? 谢谢!

2 个答案:

答案 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)。

  • 如果不能解决问题,那么CURLOPT_VERBOSE会说什么?

另外,最后请注意,此处您正在使用GET请求中的凭据发送下载请求。这是非常不寻常的,绝大多数网站都希望您使用POST请求登录,而there are good security-related reasons for that,您确定您的网站允许在GET参数中发送凭据吗?绝大多数网站都不允许......(最好的方法是记录登录的浏览器,浏览器是否使用GET参数或POST参数?)