Page 1 sur 2

Telecharger un fichier dans un repertoire cree a la volee

Posté : 19 août 2009, 17:52
par _DaWid_
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

Re: Telecharger un fichier dans un repertoire cree a la volee

Posté : 20 août 2009, 11:04
par Yosh
Salut,

Ta logique est pourtant la bonne...

Tu a un message d'erreur?

Re: Telecharger un fichier dans un repertoire cree a la volee

Posté : 20 août 2009, 14:04
par _DaWid_
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.

Re: Telecharger un fichier dans un repertoire cree a la volee

Posté : 20 août 2009, 14:12
par Sékiltoyai
Quels sont les droits du répertoire parent ?

Re: Telecharger un fichier dans un repertoire cree a la volee

Posté : 20 août 2009, 17:35
par _DaWid_
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.

Re: Telecharger un fichier dans un repertoire cree a la volee

Posté : 20 août 2009, 19:35
par Sékiltoyai
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 ?

Re: Telecharger un fichier dans un repertoire cree a la volee

Posté : 21 août 2009, 11:25
par _DaWid_
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.

Re: Telecharger un fichier dans un repertoire cree a la volee

Posté : 21 août 2009, 14:14
par Sékiltoyai
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 :)

Re: Telecharger un fichier dans un repertoire cree a la volee

Posté : 21 août 2009, 15:25
par Iris
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);

Re: Telecharger un fichier dans un repertoire cree a la volee

Posté : 21 août 2009, 17:20
par Sékiltoyai
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 ?

Re: Telecharger un fichier dans un repertoire cree a la volee

Posté : 21 août 2009, 17:33
par Iris
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.

Re: Telecharger un fichier dans un repertoire cree a la volee

Posté : 21 août 2009, 17:55
par Sékiltoyai
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…

Re: Telecharger un fichier dans un repertoire cree a la volee

Posté : 24 août 2009, 16:55
par _DaWid_
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.

Re: Telecharger un fichier dans un repertoire cree a la volee

Posté : 24 août 2009, 19:44
par Sékiltoyai
Bon, Nagol est revenu, il aura peut être un avis, sinon, à titre exceptionnel, on règlera ça par MSN.

Re: Telecharger un fichier dans un repertoire cree a la volee

Posté : 12 mars 2010, 17:40
par tekkpaf
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