Problème avec move_uploaded_file

Bonjour à toutes et à tous.

Sur le site piveron.net en cours de réalisation, je viens de mettre en place un formulaire d’inscription avec la possibilité pour le visiteur de télécharger une image (son portrait).

Dans mon code PHP j’utilise le scope $_FILES pour récupérer les infos sur le fichier téléchargé. Cette partie fonctionne bien. En faisant un var_dump de la variable $_FILE, je constate en effet que le téléchargement est effectif et que l’image est bien copiée dans le répertoire temporaire /space/uploads/; sous un nom phpxxxxxx.

C’est la toute dernière étape qui est problématique.
Car je veux copier l’image téléchargée à partir de /space/uploads/ vers un répertoire précis de mon site :
/space/www/gl-ouv/3/0/3006101819339806/web/piveron.net/www.piveron.net/html/themes/theme_dix_jours/form/upload.
A cette fin, comme le préconise le manuel PHP, j’utilise la fonction move_uploaded_file.

Je pécise que c’est mon code qui crée automatiquement le répertoire upload (par un appel à la fonction mkdir), s’il n’existe pas. Et cela marche là encore.
Mais dès que j’applique move_uploaded_file le déplacement du fichier quant à lui ne fonctionne pas et move_uploaded_file me retourne la valeur false !
Par acquis de conscience j’ai essayé aussi avec la fonction PHP ‘copy’ sans plus de succès ! Le fichier n’est jamais transféré dans le répertoire final.
Y aurait-il des problèmes de droits en écriture?

J’ajoute que j’ai découvert un détail. Je disais plus haut créer le répertoire final ‘upload’ avec mkdir en pécisant les droits 0777 dans la fonction, comme suit :
mkdir($this->mailImgDepository,0777,true)
ou $this->mailImgDepository est le nom de la variable indiquant le chemin complet et le nom du répertoire à créer.
Eh bien ! Si le répertoire est effectivement créé, il ne reçoit jamais les droits 777 mais 705 empêchant ainsi, me semble-t-il, l’attribution de certains droits d’écriture.

Autre info : j’ai aussi essayé de créer le répertoire upload par FTP en assignant les droits 777. Mais move_uploaded_file ne marche pas mieux.

Que puis-je faire?

Cordialement, Philippe.

Hello,

Quand tu dis /space/uploads, c’est depuis la racine du serveur? Donc bien au-dessus de ton espace (qui se trouve en /space/www/gl-ouv/etc…)? Ça me paraît très étrange que tu aies le droit de créer un répertoire à ce niveau. Mais bon, admettons que le script php, exécuté depuis la machine, y soit autorisé. Cela me semble ensuite normal que tu n’aies pas vraiment le droit de changer les permissions.

J’avais mis en place une solution d’upload de fichiers (des pdf) qui avait très bien fonctionné en son temps. Mais je travaillais uniquement dans mon espace /space/…/www.mondomaine.tld/… Je peux t’envoyer le code si tu veux.

Coop,
Greg

Bonjour Greg !

Merci pour ta réponse diligente.

En fait, je n’ai pas choisi de copier le fichier téléchargé dans /space/upload/. Il semble que ce soit le système et la configuration PHP du serveur qui le précisent.
Une fois le formulaire soumis avec une photographie, je récupère via la variable $_FILES toutes les informations associées à l’état du téléchargement. C’est en la consultant que j’ai découvert la référence au répertoire temporaire baptisé /space/upload. Il sert manifestement à recueillir les fichiers transférés du client vers le serveur. D’ailleurs, cette étape est conforme à ce que j’ai pu rencontrer chez d’autres hébergeurs.

Le problème vient du fait qu’à l’utilisation il m’est impossible de faire classiquement migrer ce fichier (avec move_uploaded()_file ou copy()) de ce répertoire vers un répertoire de mon choix (upload créé et situé précisément dans /web/piveron.net/www.piveron.net/html/themes/theme_dix_jours/form/). C’est bien de ce dernier répertoire dont je parle lorsque j’évoque les permissions en émettant l’hypothèse que ces droits sont à la source de mes difficultés. Mais je me trompe peut-être de piste.

Ceci étant dit, il est quand même curieux que l’étape de la copie ne marche pas alors que celles qui les précèdent, au cours du processus de transfert, se déroulent sans anicroches. Il y a manifestement un truc.

Je ne suis pas contre un exemple si tu en as un sous le coude. Peut-être trouverai-je là un moyen de contourner mes difficultés !

Je te remercie par avance !

Voici le code que j’avais:

[code]<?php

$dossier = ‘upload/’;
$fichier = basename($_FILES’fichier_source’]‘name’]);
$extensions = array(’.pdf’);
$extension = strrchr($_FILES’fichier_source’]‘name’], ‘.’);
$typeFichier = $_FILES’fichier_source’]‘type’];

//Si l’extension n’est pas dans le tableau et si type MIME correct
if(!in_array($extension, $extensions)) {
$erreur = “<p class=“attention”>The only authorized format is pdf…

”;
}

if(!isset($erreur)) //S’il n’y a pas d’erreur, on uploade
{

if(!empty($_FILES'fichier_source']'tmp_name']) && is_uploaded_file($_FILES'fichier_source']'tmp_name'])) {

	//On va vérifier la taille du fichier en ne passant pas par $_FILES'fichier_source']'size'] pour éviter les failles de sécurité
	if(filesize($_FILES'fichier_source']'tmp_name'])<2097152) {

		//On formate le nom du fichier ici...
		$fichier = strtr($fichier, 
			'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
			'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
		$fichier = preg_replace('/(^.a-z0-9]+)/i', '-', $fichier);

		//Si la fonction renvoie TRUE, c'est que ça a fonctionné:
		if(move_uploaded_file($_FILES'fichier_source']'tmp_name'], $dossier . $fichier)) {
			echo "<span class=\"attention\">The file has been successful uploaded!</span><br />\n";
			echo "You can upload another file by using the form again, or <a href=\"http://www.monsite.tld/\" target=\"_top\">return to the home page</a>.\n";
		}
		//Sinon (la fonction renvoie FALSE):
		else {
			echo "<span class=\"attention\">Upload failed!</span><br />\n";
			echo "Please contact <a href=\"mailto:moi@meme.tld\">the webmaster</a>.\n";
		}

	}

}

}
else {
echo $erreur;
}

?>

[/code] Coop, Greg

Merci Greg ! J’essaie ce code dès que possible et te tiens informé !

(re)Bonjour Greg !

Voici le petit CR de mes essais.
Ton code, tout comme le mien, est concerné par le problème parce qu’il fait appel lui aussi à la fonction move_upload_file qui ne fonctionne pas et retourne invariablement false. Le mystère est donc bien au niveau de cette commande qui refuse de copier les fichiers dans un répertoire créé dynamiquement par le script PHP.

Un peu las j’ai donc tenté autre chose. J’ai utilisé fopen et fread pour lire le contenu du fichier /space/upload/ puis l’écrire vers mon répertoire temporaire. Je n’y croyais pas trop mais cela fonctionne à merveille ! Je récupère l’image sous son nom d’origine pour la joindre en attachement à mon script d’envoi de mail.

Reconnaissons-le toutefois, passer par fread et fopen pour réaliser une simple copie de fichier, il y a plus simple, non ??? :wink:

Cordialement, Philippe.

Il a dû y avoir un changement sur le serveur, parce que mes fichiers étaient bien déplacés… Mais c’est bon à savoir: merci pour tes tests!

Coop,
Greg