Ошибка команды копирования PHP при пробелах?
Я выполняю следующие команды:
<?php
copy ("http://localhost/.../DSCF8253.JPG" , "sites/default/files/DSCF8253.JPG"); // Success!
copy ("http://localhost/.../DSCF8260.JPG" , "sites/default/files/DSCF8260.JPG"); // Success!
copy ("http://localhost/.../HERMAN 085.jpg" , "sites/default/files/HERMAN 085.jpg" ); // Fail!
?>
Первые две копии в порядке, но не последняя. Почему?
Это должно быть как-то связано с именами файлов (в последнем есть ПРОБЕЛ перед 085).
Мы будем очень признательны за любую помощь!
3 answers
http://localhost/.../HERMAN 085.jpg
Должно быть
http://localhost/.../HERMAN%20085.jpg
Копирование и обертки http менее снисходительны, чем браузеры/агенты пользователей, когда дело доходит до недопустимых URL-адресов. Пробел в URL-адресе недопустим, поэтому он должен быть urlencode
' д.
//i used this code once i tried to copy images to a wordpress site and set post featured image
//i only mentioned the part you want and did not mention other parts
$image_url = 'http://example.com/images/my image with spaces.jpg';
try {
//throw exception if can't move the file
if (!copy(str_replace(" ","%20",$image_url),$file)) {
$errors = error_get_last();
throw new Exception('Could not copy file');
}
} catch (Exception $e) {
echo $e->getMessage();
}
//using urlencode will corrupt the url if used with the full url
//it will generate something like http%dsf%swdfablablabla
//if you need to encode you will encode anything after http://yoursite.com/{encode only works here}
Самое странное: способ %20, похоже, не помогает, но после некоторых тщетных попыток (сначала с %20, затем цитирование имени файла, затем двойное цитирование, затем защита пробелов, скажите мне, если я что-то пропустил), теперь оригинальная версия работает безупречно. Это Windows 10, PHP 5.5.12, и мы находимся в 2016 году. Удачи со всеми этими детерминированными системами с конечным состоянием:)
Возможным решением, кстати, является использование exec() и копирование на уровне операционной системы. С другой стороны, это зависит от операционной системы.