Php 移动文件并重命名它

Php 移动文件并重命名它,php,permissions,copy,rename,Php,Permissions,Copy,Rename,我想PHP的重命名是我最好的选择。我没有看到很多关于如何在其中使用相对URL的例子,所以我有点妥协了。无论哪种方式,这都会导致权限被拒绝: 我想这样做: $file = "../data.csv"; rename("$file", "../history/newname.csv"); 其中。/当然会返回运行脚本的1个目录。我想不出一个办法…所以我改为: $file = "data.csv"; $path = dirname(realpath("../".$file)); rename("$pa

我想PHP的重命名是我最好的选择。我没有看到很多关于如何在其中使用相对URL的例子,所以我有点妥协了。无论哪种方式,这都会导致权限被拒绝:

我想这样做:

$file = "../data.csv";
rename("$file", "../history/newname.csv");
其中。/当然会返回运行脚本的1个目录。我想不出一个办法…所以我改为:

$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数据对tempfile.txt拥有完全控制权……但仍然被拒绝了权限。为什么?你重命名的文件必须存在吗?你不能像linux的mv那样重命名吗?所以我只是复制()和取消链接()?

不仅所有权起作用,而且文件权限也起作用。确保在源文件和目标目录上正确设置了权限(例如
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。

为了将文件从“./”移动到“./history/”,进程需要对“./”和“./history/”都具有写入权限


在您的示例中,您显然缺少对“./”的写入权限。顺便说一句,被移动文件的权限是不相关的。

实际上
644
会更好,因为CSV文件不应该是可执行的。是的,chmod是644,我甚至尝试了777让它工作。什么都没用。apache是www数据,我知道这一点,因为我移动了其他东西,需要它是www数据,加上我选中了顶部。data.csv的完整路径是/var/imvu/products/ht/clients/test/data.csv,其中/var/由root所有,imvu-through-test由wwwftp所有(我制作了一个ftp,这样我就不会将它传输到root)。同样如我所说,目录(历史记录)归www-data所有。是否该文件正在使用中?你能把它重命名为管理员吗?可能是这样,但我制作的测试文件tempfile.txt是我在root中创建的(从未被任何东西打开过),其中我将chmod改为777,然后改为www data…仍然不会重命名。