簡體   English   中英

移動文件並重命名

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM