Это может быть проблемой с другими вещами, поскольку ваша логика кажется правильной. Во-первых
rename("$oldfile","$newfile");
должно быть:
rename($oldfile,$newfile);
и:
$oldfile = "../wallpapers/temp-uploaded/".$file ;
должно быть:
$oldfile = '../wallpapers/temp-uploaded/'.$file ;
поскольку нет необходимости в дополнительной интерполяции.Ускорит вещи.Источник: Тест PHP (См. "Двойные (") и одинарные (') кавычки "). И здесь .
В отношениипроблема, вы должны сделать некоторую правильную отладку:
- выглядит ли
echo "[$oldfile][$newfile]";
как ожидалось - Убедитесь, что папка и старый файл существуют.
- делает
var_dump(file_exists($oldfile),file_exists($newfile))
output true, false
- Работает ли
file_get_contents($oldfile);
? - Работает ли
file_put_contents($newfile, file_get_contents($oldfile));
- Убедитесь, что у вас есть права на запись для папки. Обычно
chmod 777
будетdo. - Перед переименованием выполните:
if ( file_exists($newfile) ) { unlink($newfile); }
, так как вам придется удалить новый файл, если он существует, так как вы будете перемещаться к нему. Как вариант, вы можете добавить что-то к имени файла, если вы этого не сделаетехочу сделать замену. Вы поняли.
Относительно вопроса замены.
Как вы сказали, вы хотели бы удалить значения% xx, вероятно, лучше сначала их декодировать:
$file = trim(urldecode($file));
Вы можете использовать регулярное выражение тогда:
$newfile = '../wallpapers/temp-uploaded/'.preg_replace('/[\\&\\%\\$\\s]+/', '-', $file); // replace &%$ with a -
или если вы хотите быть более строгим:
$newfile = '../wallpapers/temp-uploaded/'.preg_replace('/[^a-zA-Z0-9_\\-\\.]+/', '-', $file); // find everything which is not your standard filename character and replace it with a -
\\
здесь, чтобы избежать символа регулярного выражения.Возможно, они не нужны всем персонажам, которых я сбежал, но история доказала, что вы в большей безопасности, чем потом сожалеете!;-)