2010-07-25 139 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