保存URL中的图像

时间:2014-02-12 15:47:24

标签: php curl file-get-contents

我想使用PHP中的URL获取一组图像。我尝试过使用file_get_contentscurl。以下是我尝试使用的代码。

$image = file_get_contents('http://user:pwd@server/directory/images/image1.jpg');
file_put_contents('D:/images/image1.jpg', $image);

$url = 'http://server/directory/images/image1.jpg';
$localFilePath = 'D:/images/image1.jpg';
$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
curl_setopt($ch, CURLOPT_USERPWD, "user:pwd");
$raw = curl_exec($ch);
curl_close ($ch);
if(file_exists($localFilePath)){
    unlink($localFilePath);
}
$fp = fopen($localFilePath,'wb');
fwrite($fp, $raw);
fclose($fp);

在这两种情况下,我都收到以下错误:

401 - Unauthorized : Access is denied due to invalid credentials.

密码具有特殊字符。我无法将其更改为普通密码,因为密码策略不允许它。

2 个答案:

答案 0 :(得分:0)

我没有看到你告诉CURL使用AUTHentication的地方:

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);

我认为这也可能是因为你没有使用cookies,启用它们:

curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt");

答案 1 :(得分:0)

这一行的等价物是

curl_setopt($ch, CURLOPT_USERPWD, "user:pwd");

这个,您可以通过替换

来尝试这个
curl_setopt($ch, CURLOPT_HTTPHEADER, 
      array("Authorization: Basic ".base64_encode("user:pwd")));

// also you can try by changing + / characters into _-

现在来到这一点。 Base64有几个基于RFC的实现。例如:RFC3538。不同的库或不同的语言为base64编码/解码实现了不同的RFC。例如,在某些实现中,它使用+/字符,有些使用_-字符。

因此,假设您的curl正在为授权发送base64字符串xyz+12=,但您的服务器期望字符串为xyz_12=。所以它显然无法解码。