繁体   English   中英

移动文件并重命名

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM