Функции PHP для загрузки и сохранения изображений по URL: примеры и советы
Надёжное скачивание изображений по URL в PHP ломается на редиректах, неверной валидации и отсутствии проверки заголовков; простая file_get_contents может вернуть мусор. В статье сравниваются три метода - file_get_contents, fsockopen, cURL - с примерами проверки MIME, обработки ошибок и безопасной записи на диск.
Вы сможете реализовать безопасную функцию скачивания через предпочтительный метод. По итогу сохраните файл на диск с проверкой MIME и обработкой ошибок.
1. Использование PHP функции file_get_contents()
$contents = file_get_contents('http://mydomain.com/folder/image.jpg');2. Использование PHP функции fsockopen()
Чтобы получить изображение с помощью функции fsockopen(), вам необходимо указать имя хоста оставшуюся часть адреса, по которому хранится изображение. Для лучшего понимания вот пример функции, которая возвращает изображение:
function GetImgFromHost($host,$link) {
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr (Error: $errno)n";
} else {
$out = "GET $link HTTP/1.1rn";
$out .= "Host: $hostrn";
$out .= "Connection: Closernrn";
$out .= "Accept: text/xml,application/xml,application/xhtml+xml,
text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5rn";
$out .= "Accept-Language: en-us,en;q=0.5rn";
$out .= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7rn";
$out .= "Keep-Alive: 300rn";
$out .= "rn";
fwrite($fp, $out);
$contents='';
while (!feof($fp)) {
$contents.= fgets($fp, 1024);
}
fclose($fp);
return $contents;
}
}Пример вызова:
$sourceimg=GetImgFromHost("www.mywebsiteexample.com","/image.jpg");
$sourceimg=strchr($sourceimg,"rnrn"); //удаляем заголовки
$sourceimg=ltrim($sourceimg); //удаляем пробелы в начале строки3. Использование CURL
function GetImageFromUrl($link) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch,CURLOPT_URL,$link);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
return $result;
}Вы можете использовать следующий код, чтобы вызвать функцию для получения изображения:
$sourcecode=GetImageFromUrl("http://example.com/path/image.jpg");После скачивания изображения вам нужно сохранить его, просто выполнив сохранение в файл по заданному пути.
Вы можете использовать следующий код:
$savefile = fopen('/home/path/image.jpg', 'w');
fwrite($savefile, $sourcecode);
fclose($savefile);
Комментарии