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

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

  1. $from = 'https://snipp.ru/demo/906/Ибисы бесплатные фотографии.jpg';
  2. $to = __DIR__ . '/' . basename($from);
  3. 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():
  1. function urlencode_str($matches)
  2. {
  3. $str = $matches[0];
  4. $str = rawurlencode($str);
  5. return $str;
  6. }
  7.  
  8. $from = 'https://snipp.ru/demo/906/Ибисы бесплатные фотографии.jpg';
  9. $from = preg_replace_callback('/[а-яА-Яёй\s]+/ui', 'urlencode_str', $from);
  10. $to = __DIR__ . '/' . basename($from);
  11.  
  12. copy($from, $to);


  28.04.24 / 18:51 | PHP |   118 | 5   0