2010-07-25 6 views
4

Переименование фигурного PHP будет моим лучшим выбором. Я не видел много примеров того, как использовать в нем относительные URL-адреса, поэтому я как бы скомпрометирован. В любом случае, это даст мне разрешение отказано:Перенесите файл и переименуйте его

Я хочу, чтобы это сделать:

$file = "../data.csv"; 
rename("$file", "../history/newname.csv"); 

Где ../ конечно бы вернуться 1 каталог, откуда запускается скрипт RAN. Я не мог понять, как ... так что я сделал это вместо:

$file = "data.csv"; 
$path = dirname(realpath("../".$file)); 
rename("$path/$file", "$path/history/newname.csv"); 

Однако я получаю разрешения отказано (да папку истории принадлежат WWW-данные, да и data.csv является принадлежащих www-данным). Я думал, что это было странно, так что я попытался простой тест:

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

, и я убедился, WWW-данные имели полный контроль над tempfile.txt ... до сих пор получил разрешение отказано. Зачем? файл, который вы переименовываете, должен существовать? не можете ли вы переименовать, как linux mv? Поэтому вместо этого я просто копирую() и unlink()?

ответ

4

Для перемещения файла с "../" на "../history/", процесс требует права на запись как "../", так и "../history/".

В вашем примере у вас явно нет разрешения на запись в «../». Кстати, разрешения на перемещаемый файл не имеют отношения.

1

Не только право собственности играет определенную роль, но и разрешает доступ к файлам. Убедитесь, что разрешения правильно настроены в исходном файле и каталоге назначения (например, chmod 644 data.csv).

Является ли www-data тем же пользователем, что и Apache?

Edit: Позаботьтесь, чтобы обеспечить существующие, абсолютные пути к realpath(). Также остерегайтесь следующего:

$path = dirname(realpath("../".$file)); 

Это не может дать ничего, потому что файл ../data.csv не может существовать. I.e., результат realpath() в несуществующем файле false.

Вот код, который может работать лучше для вас:

$file = "data.csv"; 
$path1 = realpath($file); 
$path2 = realpath(dirname($file).'/..').'/history/newname.csv'; 
rename($path1, $path2); 

Вы должны быть предельно осторожными, что $file не может быть отредактирована посетителем, потому что он может изменить запрос манипулировать, какой файл переименовывается где.

+3

На самом деле '644' было бы лучше, так как файл CSV не должен быть исполняемым. –

+0

да chmod is 644, я даже пытался 777 заставить его работать. Ничего не работает. и apache - www-data, я знаю это, потому что я перемещаю другие вещи и нуждаюсь в том, чтобы быть www-данными, плюс я проверил верх. – ParoX

+0

Полный путь к data.csv будет /var/imvu/products/ht/clients/test/data.csv где/var/принадлежит root, imvu через test принадлежит wwwftp (ftp i сделал так, что я не ftp в корень). Также, как я уже сказал, каталог, где его происходит (история), принадлежит www-данным. – ParoX

Смежные вопросы