[英]Move a file and rename it
想PHP的重命名將是我最好的選擇。 我沒有看到很多關於如何在其中使用相對URL的示例,所以我有點妥協。 無論哪種方式,這給了我許可否認:
我想做這個:
$file = "../data.csv";
rename("$file", "../history/newname.csv");
其中../當然會返回運行腳本的目錄。 我想不出辦法......所以我這樣做了:
$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-data完全控制tempfile.txt ...仍然被拒絕權限。 為什么? 你重命名它的文件必須存在嗎? 你不能像linux的mv一樣重命名嗎? 所以我只是復制()和取消鏈接()?
為了將文件從“../”移動到“../history/”,進程需要對“../”和“../history/”的寫入權限。
在您的示例中,您顯然缺少對“../”的寫入權限。 順便說一下,正在移動的文件的權限是不相關的。
所有權不僅起着作用,還起着文件權限的作用。 確保在源文件和目標目錄上正確設置了權限(例如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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.