Page 1 sur 1

formulaire d'upload/affichage d'image

Posté : 03 août 2006, 00:46
par Moker
bonsoir,

pourriez vous m'aider à terminer un formulaire d'upload d'image?

dites moi si je me trompe mais l'upload de fichier se passe de la maniere suivante :
  • 1. Affichage du formulaire d'upload (demande utilisateur avec la balise input type="file")
    2. Memorisation temporaire du fichier (1er validation du formulaire)
    3. Deplacement et stockage du fichier temporaire (2em validation du formulaire)
je desire afficher l'image soumise tout au long du script, pour l'etape 3 aucun probleme car je connait le chemin de l'image :
echo "<img src=\"".$_SERVER["DOCUMENT_ROOT"]."/trombi/photos/".$_POST["photo"]."\" />";
mais pour l'etape 2, comme l'image n'est encore q'un fichier temporaire, il faut que l'utilisateur valide une nouvelle fois le formulaire :
echo "La photo à bien été envoyée, veuillez valider le formulaire";
voici le script en question :
<form method="post" enctype="multipart/form-data">

<?php

// Si aucune photo n'est memorisée dans le formulaire
if(!isset($_POST["photo"])){

	// Si aucune photo n'est uploadée ou une erreur est survenue pendant l'upload
	if(!isset($_FILES["photo"]) || $_FILES["photo"]["error"] != 0){
	
		// Demande  de la photo
		echo '<input type="file" name="photo" size="30">';
		
	}else{
	
		// params
		unset($erreur);
		$extensions_ok = array('png', 'gif', 'jpg', 'jpeg');
		$taille_max = 100000;
		$dest_dossier = $_SERVER["DOCUMENT_ROOT"].'/trombi/photos/';
		
		// vérifications
		if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) ){
			$erreur = 'Veuillez sélectionner un fichier de type png, gif ou jpg !';
		}
		
		elseif( file_exists($_FILES['photo']['tmp_name']) and filesize($_FILES['photo']['tmp_name']) > $taille_max){
			$erreur = 'Votre fichier doit faire moins de 500Ko !';
		}
		
		// copie du fichier
		if(!isset($erreur)){
			$dest_fichier = basename($_FILES['photo']['name']);
			// formatage nom fichier
			// enlever les accents
			$dest_fichier = strtr($dest_fichier,
			'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
			'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
			// remplacer les caracteres autres que lettres, chiffres et point par _
			$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
			// copie du fichier
			move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier);
			// Affiche la photo uploadée
			echo "La photo à bien été envoyée, veuillez valider le formulaire";
			// Memorise le nom de la photo dans le formulaire
			echo "<input type=\"hidden\" name=\"photo\" value=\"$dest_fichier\" />\n";
		}

	}
	
}else{

	echo "<img src=\"".$_SERVER["DOCUMENT_ROOT"]."/trombi/photos/".$_POST["photo"]."\" />";
	echo "<input type=\"hidden\" name=\"photo\" value=\"".$_POST["photo"]."\" />\n";
	
}

?>

</form>
auriez vous une idée pour afficher l'image dés la 1er soumission du formulaire (lorsque l'image n'est encore qu'un fichier temporaire) ?

Mercid'avance :wink:

Posté : 03 août 2006, 00:53
par Truc
Salut,
Je ne vois pourquoi tu veux revalider le formulaire une deuxième fois.
Si tu arrives sur ces lignes:
 move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier);
            // Affiche la photo uploadée
            echo "La photo à bien été envoyée, veuillez valider le formulaire"; 
L'image est déjà "uploadée" et disponible à l'adresse : "$dest_dossier . $dest_fichier"

Posté : 03 août 2006, 22:06
par Moker
merci beaucoup truc :wink:

je regrette de ne pas l'avoir remarqué ! ca saute au yeux pourtant :)
merci encore !

j'ai donc un peu modifié mon script :
<form method="post" enctype="multipart/form-data">

<?php

// Si l'utilisateur desire changer de photo
if(isset($_POST["modifier_photo"])){

	// efface le fichier uploadé
	$del = unlink($_SERVER["DOCUMENT_ROOT"]."work/photos/".$_POST["photo"]);
	unset($_POST["photo"]);
}

// Si aucune photo n'est soumise au le formulaire
if(!isset($_POST["photo"])){

	// Si aucune photo n'est uploadée ou une erreur est survenue pendant l'upload
	if(!isset($_FILES["photo"]) || $_FILES["photo"]["error"] != 0){
	
		// Formulaire de demande de la photo
		echo '<input type="file" name="photo" size="30"><br />';
		echo '<input type="submit" name="envoi_photo" value="Envoyer">';
	
	// Si aucune erreur et upload ok	
	}else{
	
		// Detruit $erreur
		unset($erreur);
		
		// Parametres
		$extensions_ok = array('png', 'gif', 'jpg', 'jpeg');
		$taille_max = 100000;
		$dest_dossier = $_SERVER["DOCUMENT_ROOT"].'work/photos/';
		
		// vérifications //
		// de l'extension
		if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) ){
			$erreur = 'Veuillez sélectionner un fichier de type png, gif ou jpg !';
		}
		// de la taille
		elseif( file_exists($_FILES['photo']['tmp_name']) and filesize($_FILES['photo']['tmp_name']) > $taille_max){
			$erreur = 'Votre fichier doit faire moins de 1mo !';
		}
		
		// copie du fichier temporaire sur le disque
		if(!isset($erreur)){
		
			$dest_fichier = basename($_FILES['photo']['name']);
			
			// formatage du nom de fichier //
			// enlever les accents
			$dest_fichier = strtr($dest_fichier,
			'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
			'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
			// remplacer les caracteres autres que lettres, chiffres et point par _
			$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
			
			// copie du fichier et deplacement du fichier temporaire
			move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier);
			
			// Affiche la photo uploadée
			echo "<img src=\"".$dest_dossier.$dest_fichier."\" /><br />";
			echo '<input type="submit" name="modifier_photo" value="Modifier">';
			
			// Memorise le nom de la photo dans/pour le formulaire
			echo "<input type=\"hidden\" name=\"photo\" value=\"$dest_fichier\" />\n";
		}

	}

// Si une photo à deja été uploadée	
}else{

	echo "<img src=\"".$_SERVER["DOCUMENT_ROOT"]."work/photos/".$_POST["photo"]."\" /><br />";
	echo "<input type=\"hidden\" name=\"photo\" value=\"".$_POST["photo"]."\" />\n";
	echo '<input type="submit" name="modifier_photo" value="Modifier">';
	
}

?>

</form>
pourriez vous me dire si la suppression de fichier ne pose pas de problemes de securité et si c'est bien ecrit ?

merci a vous!

Posté : 04 août 2006, 00:52
par Ryle
Pas de soucis à mon sens pour le unlink, mais quelques problèmes que tu peux rencontrer :

$_SERVER["DOCUMENT_ROOT"] : te donne le chemin par rapport au disque (C:\... , /home/...) il est donc à utiliser lorsque tu fais de la manipulation de fichier (donc pour le unlink ou le move_upload_file, ...). Par contre si tu l'utilises dans tes balises html (dans ton <img src=""> notamment), il tentera d'ouvrir l'image depuis le C:\... de l'utilisateur et non celui du serveur. Du coup, à moins d'avoir le fichier en local sur son disque (ce qui est uniquement ton cas) ils ne les verront pas. Il faut à ce niveau te baser sur les chemins de l'url et non pas sur les chemins physiques du disque
(bon il est tard, je sais pas si je suis très clair :))

Posté : 04 août 2006, 08:55
par Moker
merci ryle ! c'est parfaitement clair :wink:

je doit plutot utiliser le chemin relatif (ex : "../photos/") pour les balises img, par contre ça doit etre la meme chose pour ulink et move_upload_file etant donné que les fichier que je manipule se trouve aussi du coté serveur :?

en tout cas merci beaucoup a vous deux !! votre aide m'as été precieuse :wink:

bonne journée à tous :D