Telecharger un fichier dans un repertoire cree a la volee

_DaWid_
Invité n'ayant pas de compte PHPfrance

19 août 2009, 17:52

Salut a tous,

Je parcours depuis quelques jours les differents forums et articles +/- interessants sur ce sujet-la et je n'arrive pas a trouver de reponse claire et precise quant a mon probleme.

Je desire tout simplement via un formulaire telecharger un fichier dans un repertoire que je cree dans le POST du script.

Le scenario reste assez simple :
- Le client soumet le formulaire via un input file
- Le script php cree a un endroit specifique le repertoire '1234'
- Le script execute la methode : move_uploaded_file afin de placer le fichier sous le repertoire '1234'

Jusque la, rien de bien extraordinaire sauf que je n'arrive pas a faire fonctionner cette sauce.
J'ai essaye umask, chmod, chown, chgrp mais rien y fait. Tant que mon repertoire '1234' n'est pas propriete de root je n'arrive pas a faire quoi que ce soit.
Le user et le groupe proprietaires par defaut est 'apache' dans mon cas, mais peut-etre 'nobody' sur d'autres serveurs.

Quelle est donc cette demarche qui me manque pour offrir la possibilite a un script php de faire ce que je souhaite ? Faut-il mettre le user apache dans un groupe en particulier ?

La question ne se posait pas jusqu'a present car mon repertoire receptacle n'etait pas cree a la volee et un tit chmod 777 degueulasse et le tour etait joue.

Merci d'avance !
David

Mammouth du PHP | 568 Messages

20 août 2009, 11:04

Salut,

Ta logique est pourtant la bonne...

Tu a un message d'erreur?

_DaWid_
Invité n'ayant pas de compte PHPfrance

20 août 2009, 14:04

J'ai eu en retour l'erreur extremement classique : "Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move...."

Je n'ai tout simplement pas le droit d'ecriture (ou du moins mon script php) sur ce repertoire la qui est pourtant en 777. Par contre, si manuellement je mets root en proprietaire, ca fonctionne.
Il est evidemment impossible de mettre root proprietaire de ce fichier a la volee en php.
J'ai entendu parler de suPHP...et des pbs de securite qu'il creerait...ca semblerait etre une des solutions.

ViPHP
ViPHP | 5924 Messages

20 août 2009, 14:12

Quels sont les droits du répertoire parent ?

_DaWid_
Invité n'ayant pas de compte PHPfrance

20 août 2009, 17:35

Les droits du repertoire parent sont 777.
J'ai essaye de changer le proprietaire de ce repertoire parent a apache ou bien a root mais rien n'y fait.

ViPHP
ViPHP | 5924 Messages

20 août 2009, 19:35

le proprietaire de ce repertoire parent
Qui est ?
Et le groupe, c'est quoi ?

C'est un hébergement mutualisé ou dédié ?
Tu essayes de modifier les droits via ftp ou ssh ?
Quand tu dis que tu ne peux pas changer le propriétaire, quelle est l'erreur ?

_DaWid_
Invité n'ayant pas de compte PHPfrance

21 août 2009, 11:25

J'ai fait des essais en mettant en groupe et en proprietaire root puis apache. Ca n'a rien fait.

C'est un serveur dedie et je fais les modifs par ssh.

Concernant le message d'erreur, j'ai essaye sur 2 serveurs dedies differents et j'ai soit rien (mais la fonction chown renvoie FALSE), soit operation not permitted d'apres ce que je me rappelle.
J'ai verifie la config apache et sur ces 2 serveurs le SAFE_MODE est a OFF.

ViPHP
ViPHP | 5924 Messages

21 août 2009, 14:14

C'est normal, le chown n'est utilisable que par le propriétaire. Tu trouverais ça noraml de pouvoir changer les droits de fichiers qui ne t'appartiennnent pas ?

Quels sont les groupe et propriétaire du répertoire parent à celui que tu essayes de créer ?

En guise de test, réduit ton code php au strict minimum :
- Le mkdir pour la création du répertoire (éventuellement agrémenté de chmods)
- Un touch à l'intérieur du répertoire
Refais tes tests et poste ton code de test et tes résultats. Mets aussi le error_reporting à E_ALL | E_STRICT en PHP5, E_ALL en PHP4.

Tu dis que tu as plusieurs serveurs, ne travaille que sur un seul, en donnant toutes les informations déjà citées (user et group du serveur, que tu trouveras dans la conf apache), le mode d'exécution de php (handler, cgi, fastcgi, isapi, ou suexec).

Voilà, et avec ça on devrait avancer :)

Petit nouveau ! | 8 Messages

21 août 2009, 15:25

J'utilise cette fonction par ftp qui fonctionne très bien pour moi. Définir bien sur les bonnes constantes CLIENT_FTP_NAME, etc...
function changemode($path = '', $xcite) {
	$ftp_details = array(
	ftp_user_name => CLIENT_FTP_NAME,
	ftp_user_pass => CLIENT_FTP_PASS,
	ftp_user_root => CLIENT_FTP_ROOT,
	ftp_server => CLIENT_FTP_SERVER 
	);
	$mod = intval($xcite, 8);
	extract ($ftp_details);
	$conn_id = ftp_connect($ftp_server);
	$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
	if (ftp_site($conn_id, 'CHMOD '.$mod.' '.$ftp_user_root.$path) !== false) {
	   $success=TRUE;
	}
	else {
	   $success=FALSE;
	}
	ftp_close($conn_id);
	return $success;
}

changemode('un_dossier', 777);
/*
Opérations
*/
changemode('un_dossier', 755);

ViPHP
ViPHP | 5924 Messages

21 août 2009, 17:20

J'utilise cette fonction par ftp qui fonctionne très bien pour moi. Définir bien sur les bonnes constantes CLIENT_FTP_NAME, etc...
Mmh, avant de répondre, es-tu sûr d'avoir bien lu le sujet ?

Petit nouveau ! | 8 Messages

21 août 2009, 17:33

Oui il veut pouvoir placer ou déplacer un fichier dans un dossier qui n'a pas les bons droits !
Donc, avec cette fonction, et en utilisant un compte FTP root par exemple, il pourra faire ce qu'il veut lorsque l'internaute fera l'upload du fichier sur le serveur.

ViPHP
ViPHP | 5924 Messages

21 août 2009, 17:55

Oui il veut pouvoir placer ou déplacer un fichier dans un dossier qui n'a pas les bons droits !
Donc, avec cette fonction, et en utilisant un compte FTP root par exemple, il pourra faire ce qu'il veut lorsque l'internaute fera l'upload du fichier sur le serveur.
Euh, rassure moi, tu as vraiment ton compte root accessible par FTP ? :shock:

Et je pense qu'une vraie solution, à savoir une solution qui règle réellement les problèmes de droit, justement sans utiliser FTP, et encore moins avec un compte root, est de loin préférable…

_DaWid_
Invité n'ayant pas de compte PHPfrance

24 août 2009, 16:55

L'operation de creation a la volee a ete mise de cote au vu de ses differents pbs mais ca me titille tout de meme. J'aimerais bien trouver la solution.

Pour repondre a la question de Sékiltoyai (il me semble d'ailleurs y avoir repondu) j'ai essaye plusieurs combinaisons pour le repertoire parent : root, apache, nobody et rien n'y a fait.
J'ai tjs la meme erreur au niveau de la fonction move_uploaded_file qui me renvoie false.

Pour que le mkdir fonctionne, il faut que le repertoire proprietaire soit root. A ce moment-la , il me cree bien un sous-repertoire toto avec apache comme proprio.
Et de fait, le probleme se repercute dans le process de creer un fichier sous ce sous-repertoire toto. Il faudrait que root soit le proprio de toto.

Un veritable casse-tete qui n'en est plus un maintenant pour moi mais qui je suis sur donc ennuyer pas mal de programmeurs !

Concernant l'histoire des 2 serveurs, l'un est la prod et l'autre l'environnement de test, mais tu as raison, ne travaillons que sur un seul.

ViPHP
ViPHP | 5924 Messages

24 août 2009, 19:44

Bon, Nagol est revenu, il aura peut être un avis, sinon, à titre exceptionnel, on règlera ça par MSN.

tekkpaf
Invité n'ayant pas de compte PHPfrance

12 mars 2010, 17:40

Bonjour tout le monde, je me permet de relancer ce post car j'ai exactement le même problème mais avec un copy().
Je crée un répertoire avec mkdir($nom, 0777) et ensuite je veux copier deux fichier depuis un dossierModele vers ce nouveau répertoire. Je fais donc copy('dossierModele/index.php', $nom.'/index.php') mais la copie ne s'effectue pas!!
merci d'avance