2010-07-25 114 views
4

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.csv是由www-data拥有)。我认为这件事很奇怪,所以我尝试了一个简单的测试:

rename('tempfile.txt', 'tempfile2.txt'); 

,我确信www数据有超过tempfile.txt完全控制......仍然有许可被拒绝。为什么?你重命名它必须存在的文件?你可以不像linux的mv重命名吗?所以我只是复制()和取消链接()?

回答

4

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

在你的例子中,你显然缺乏“../”的写入权限。顺便说一下,被移动文件的权限并不相关。

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不能访问者进行编辑,因为他可以改变的请求操纵该文件被重命名到哪里。

+3

实际上'644'会更好,因为一个CSV文件不应该是可执行的。 – 2010-07-25 23:57:18

+0

是的chmod是644,我甚至尝试过777让它工作。没有任何工作。而apache是​​www-data,我知道这是因为我移动了其他东西,并且需要它成为www-data,再加上我查了顶部。 – ParoX 2010-07-26 00:00:19

+0

data.csv的完整路径为/var/imvu/products/ht/clients/test/data.csv,其中/ var /由root拥有,imvu通过测试属于wwwftp(一个ftp我拥有,所以我不用ftp到root)。也就像我说的那样,它的历史由www数据拥有。 – ParoX 2010-07-26 00:02:12