2010-07-25 6 views
4

Le renommé de PHP serait mon meilleur pari. Je n'ai pas vu beaucoup d'exemples sur la façon d'utiliser les URL relatives, alors j'ai un peu compromis. De toute façon, cela me donne la permission refusée:Déplacer un fichier et le renommer

Je veux faire:

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

../ bien sûr serait revenir en arrière 1 répertoire à partir duquel le script est RAN. Je ne pouvais pas trouver un moyen ... donc je l'ai fait à la place:

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

Cependant, je reçois permission refusée (oui le dossier historique est la propriété de www-data, et oui data.csv est propriété de www-data). Je pensais que c'était bizarre alors j'ai essayé un test simple:

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

et je me suis assuré www-data a un contrôle total sur tempfile.txt ... encore obtenu l'autorisation refusée. Pourquoi? Est-ce que le fichier que vous le renommer doit exister? ne pouvez-vous pas renommer comme mv de linux? Donc je copie plutôt() et unlink()?

Répondre

4

Pour déplacer un fichier de "../" à "../history/", un processus doit avoir une autorisation d'écriture sur "../" et "../history/".

Dans votre exemple, il vous manque manifestement l'autorisation d'écriture sur "../". Les permissions pour le fichier en cours de déplacement ne sont pas pertinentes, d'ailleurs.

1

Non seulement la propriété joue un rôle, mais également les autorisations de fichier. Assurez-vous que les autorisations sont correctement configurées sur le fichier source et le répertoire de destination (par exemple chmod 644 data.csv).

Est-ce que www-data est le même utilisateur que Apache?

Edit: Prenez soin de fournir existants, des chemins absolus à realpath(). Aussi méfiez-vous des éléments suivants:

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

Cela pourrait ne rien céder, car le fichier ../data.csv peut ne pas exister. C'est-à-dire que le résultat de realpath() sur un fichier inexistant est false.

est ici un code qui pourrait fonctionner mieux pour vous:

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

Vous devez être extrêmement prudent que $file ne peut pas être modifié par le visiteur, parce qu'il pourrait changer une demande de manipuler quel fichier est renommé où.

+3

En fait '644' serait préférable, car un fichier CSV ne devrait pas être exécutable. –

+0

oui le chmod est 644, j'ai même essayé 777 pour le faire fonctionner. Rien ne fonctionne. et apache est www-data, je le sais parce que je déplace d'autres trucs et que j'ai besoin d'être www-data, plus j'ai vérifié top. – ParoX

+0

Le chemin d'accès complet à data.csv serait /var/imvu/products/ht/clients/test/data.csv où/var/appartient à root, imvu through test est la propriété de wwwftp (un ftp je l'ai fait donc je ne le fais pas ftp en racine). Aussi comme je l'ai dit, le dir où il va (histoire) est la propriété de www-data. – ParoX

Questions connexes