Ошибка PHP функции copy() если в названии файла есть русские буквы

У PHP функции copy($from, $to) возникает ошибка, если в параметре $from указать URL, в котором содержатся русские буквы, например:


$from = 'https://snipp.ru/demo/906/Ибисы бесплатные фотографии.jpg';
$to = __DIR__ . '/' . basename($from);
copy($url, $to);

Вернет ошибку:

Warning: copy(https://snipp.ru/demo/906/Ибисы бесплатные фотографии.jpg): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request

Решение проблемы

URL-кодирование кириллицы с помощью функции rawurlencode():

function urlencode_str($matches)
{
$str = $matches[0];
$str = rawurlencode($str);
return $str;
}

$from = 'https://snipp.ru/demo/906/Ибисы бесплатные фотографии.jpg';
$from = preg_replace_callback('/[а-яА-Яёй\s]+/ui', 'urlencode_str', $from);
$to = __DIR__ . '/' . basename($from);

copy($from, $to);


  28.04.24 / 15:51 | PHP |   213 | 5   0