[英]Move a file and rename it
想PHP的重命名将是我最好的选择。 我没有看到很多关于如何在其中使用相对URL的示例,所以我有点妥协。 无论哪种方式,这给了我许可否认:
我想做这个:
$file = "../data.csv";
rename("$file", "../history/newname.csv");
其中../当然会返回运行脚本的目录。 我想不出办法......所以我这样做了:
$file = "data.csv";
$path = dirname(realpath("../".$file));
rename("$path/$file", "$path/history/newname.csv");
但是我被拒绝了许可 (是的,历史文件夹由www-data拥有,是的,data.csv由www-data拥有)。 我觉得这很奇怪所以我尝试了一个简单的测试:
rename( 'tempfile.txt', 'tempfile2.txt' );
我确保www-data完全控制tempfile.txt ...仍然被拒绝权限。 为什么? 你重命名它的文件必须存在吗? 你不能像linux的mv一样重命名吗? 所以我只是复制()和取消链接()?
为了将文件从“../”移动到“../history/”,进程需要对“../”和“../history/”的写入权限。
在您的示例中,您显然缺少对“../”的写入权限。 顺便说一下,正在移动的文件的权限是不相关的。
所有权不仅起着作用,还起着文件权限的作用。 确保在源文件和目标目录上正确设置了权限(例如chmod 644 data.csv
)。
www-data
与Apache的用户相同吗?
编辑:注意提供realpath()
现有绝对路径 。 还要注意以下事项:
$path = dirname(realpath("../".$file));
这可能不会产生任何结果,因为文件../data.csv
可能不存在。 即,不存在的文件上的realpath()
的结果是false
。
以下是一些可能更适合您的代码:
$file = "data.csv";
$path1 = realpath($file);
$path2 = realpath(dirname($file).'/..').'/history/newname.csv';
rename($path1, $path2);
您应该非常小心访问者无法编辑$file
,因为他可以更改请求操作将哪个文件重命名为where。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.