移动文件并重命名
Posted
技术标签:
【中文标题】移动文件并重命名【英文标题】:Move a file and rename it 【发布时间】:2011-03-20 21:03:52 【问题描述】:想通 php 的重命名将是我最好的选择。不过,我没有看到很多关于如何在其中使用相对 URL 的示例,所以我有点妥协了。不管怎样,这给了我权限被拒绝:
我想这样做:
$file = "../data.csv";
rename("$file", "../history/newname.csv");
Where ../ 当然会回到运行脚本的 1 个目录。我想不出办法……所以我这样做了:
$file = "data.csv";
$path = dirname(realpath("../".$file));
rename("$path/$file", "$path/history/newname.csv");
但是我得到 permission denied(是的,历史文件夹归 www-data 所有,是的 data.csv 归 www-data 所有)。我觉得这很奇怪,所以我尝试了一个简单的测试:
rename( 'tempfile.txt', 'tempfile2.txt' );
我确保 www-data 可以完全控制 tempfile.txt...仍然被拒绝许可。为什么?您重命名的文件是否必须存在?你不能像linux的mv一样重命名吗?所以我只是复制()和取消链接()?
【问题讨论】:
【参考方案1】:不仅所有权起作用,而且文件权限也起作用。确保源文件和目标目录的权限设置正确(例如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
,因为他可以更改请求操作哪个文件被重命名到哪里。
【讨论】:
其实644
会更好,因为CSV文件不应该是可执行的。
是的,chmod 是 644,我什至尝试了 777 让它工作。没有任何工作。和 apache 是 www-data,我知道这一点是因为我移动了其他东西并且需要它是 www-data,而且我检查了顶部。
data.csv 的完整路径是 /var/imvu/products/ht/clients/test/data.csv 其中 /var/ 归 root 所有,通过测试的 imvu 归 wwwftp 所有(我做了一个 ftp,所以我不 ftp 进入 root)。就像我说的那样,它的去向(历史)目录归 www-data 所有。
会不会是文件在使用中?可以重命名为管理员吗?
可能是这样,但是我制作的测试文件 tempfile.txt 只是我在 root 中创建的(从未被任何东西打开),然后我在其中 chmod 到 777 然后 chown 到 www -data...仍然不会重命名。【参考方案2】:
为了将文件从“../”移动到“../history/”,进程需要对“../”和“../history/”都有写权限。
在您的示例中,您显然缺乏对“../”的写入权限。顺便说一下,被移动文件的权限是不相关的。
【讨论】:
以上是关于移动文件并重命名的主要内容,如果未能解决你的问题,请参考以下文章