Переместить файл и переименовать его - PullRequest
5 голосов
/ 26 июля 2010

Подумал, что переименование 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, и да, data.csv принадлежит www-data). Я подумал, что это странно, поэтому я попробовал простой тест:

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

и я убедился, что www-data имеет полный контроль над tempfile.txt ... все же получено отказано в разрешении. Зачем? должен ли существовать файл, который вы переименовали, чтобы он существовал? Вы не можете переименовать, как в Linux Linux? Так что я вместо этого просто копировать () и unlink ()?

Ответы [ 2 ]

5 голосов
/ 26 июля 2010

Чтобы переместить файл из «../» в «../history/», процессу требуется разрешение на запись как в «../», так и в «../history/".

* 1002».* В вашем примере вам явно не хватает разрешения на запись в "../".Кстати, разрешения для перемещаемого файла не имеют значения.
2 голосов
/ 26 июля 2010

Не только владение играет роль, но и права доступа к файлам.Убедитесь, что права доступа правильно установлены для исходного файла и каталога назначения (например, 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 не может быть отредактирован посетителем, потому что он может изменить запрос, манипулируя тем, куда файл переименован.

...