可能是由于其他原因导致的问题,因为您的逻辑似乎是正确的。
首先。
rename("$oldfile","$newfile");
should be:
rename($oldfile,$newfile);
并且:
$oldfile = "../wallpapers/temp-uploaded/".$file ;
should be:
$oldfile = '../wallpapers/temp-uploaded/'.$file ;
由于没有必要进行额外的插值,因此使用单引号将加快速度。来源:PHP基准测试(参见“双引号(“)与单引号(')”)。和这里。
关于问题,您需要进行一些适当的调试:
- 是否如预期那样显示
echo "[$oldfile][$newfile]";
- 确保文件夹和旧文件存在。
var_dump(file_exists($oldfile),file_exists($newfile))
是否输出true, false
file_get_contents($oldfile);
是否有效?
file_put_contents($newfile, file_get_contents($oldfile));
是否有效?
- 确保您拥有文件夹的写入权限。通常
chmod 777
就可以了。
- 在重命名之前执行:
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 -
这里的 \\
是为了转义正则表达式中的特殊字符。可能并不是所有我转义的字符都需要它们,但历史证明,谨慎起见总是更好的选择!;-)