Php 移动文件并重命名它
我想PHP的重命名是我最好的选择。我没有看到很多关于如何在其中使用相对URL的例子,所以我有点妥协了。无论哪种方式,这都会导致权限被拒绝: 我想这样做: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
$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…仍然不会重命名。