Page 1 sur 2

Chemin d'un fichier Upload

Posté : 07 nov. 2010, 18:22
par necromoine
Bonjour, j'ai creer une zone admin la semaine derniere, et j'ai decidé d'ajouter un system d'upload d'image.
Cependant, je voudrais qu'un fois que l'image soit upload, le chemin pour l'afficher doit donné.
J'avais penser a un code comme celui la :
echo 'Pour l\'inserer dans un article, copier ce code : <br />
<img src="$destination\$_FILES[\'name\']" alt="Image" />';

Mais il ne marche pas (pas étonnant je pense).
La premiere chose, et qu'il s'execute (il affiche l'image et nom le code)
Deuxiement, les variables ne sont pas remplacée.

Merci

Re: Chemin d'un fichier Upload

Posté : 07 nov. 2010, 19:00
par moogli
salut essai
<?php
echo htmlentities('Pour l\'insérer dans un article, copier ce code :

<img src="'.$destination.'/'.$_FILES['name'].'" alt="Image" />');
?>
je te conseil de revoir la concaténation, de plus les variables ne sont pas interprétées dans une chaine entourée des ' (c'est dans une chaine entourée de " qu'elles le sont).

@+

Re: Chemin d'un fichier Upload

Posté : 07 nov. 2010, 20:56
par AB
$_FILES['name'] c'est le nom du fichier uploadé.

Concernant l'upload de fichier :

Par défaut dans le cas où un fichier de même nom existe déjà sur le serveur, l'ancien fichier va être écrasé et remplacé par le nouveau.

A moins d'avoir une fonction qui renomme ton nouveau fichier dans ce cas.

Si cette fonction est déjà intégrée dans ton code alors il ne faut pas utiliser $_FILES['name'] mais le nom du fichier renommé.

Si cette fonction n'est pas intégrée, je peux te donner un exemple avec une classe existante (qui peut également indiquer le chemin complet pour insertion de l'image).

L'emploi de $_FILES['name'] n'est donc approprié que dans le cas où un nouveau fichier peut écrasé un fichier de même nom déjà existant.

Re: Chemin d'un fichier Upload

Posté : 07 nov. 2010, 21:42
par Necromoine
Je doit avouer que je n'ai pas compris tout ce que tu as dit.
Mais par contre, pourrait tu m'expliquer comment fonction on script pour renommer un fichier.
Et si il est a la portee d'un debutant (-10 jours de code).

A moogli, je test des que j'ai acces a mon pc.
Merci a vous.

Re: Chemin d'un fichier Upload

Posté : 07 nov. 2010, 22:22
par AB
Mais par contre, pourrait tu m'expliquer comment fonction on script pour renommer un fichier.
Pour te donner un code qui fonctionne sans que tu n'es beaucoup à intervenir indiques moi le dossier dans lequel tu veux uploader tes images.

Re: Chemin d'un fichier Upload

Posté : 07 nov. 2010, 22:44
par Necromoine
Merci, mais le chemin varie.
Dans la soummision de l'image, il y a une lisre deroulante avec la categorie de l'image. (film.photo.autre)
J'ai donc fait une boucle avec if/elseif pour modifier $destination en fonction de la categorie choisie.
Je n'ai pas peur de me noyer dans du code alors pourrait tu marquer les endroit ou il faut que je mette les chemins d'acces.
Ou meme me donner uniquement les fonctions que tu utilise e la facon dont marche ton code.

S'entrailer et le meilleur moyen de progresser.

Re: Chemin d'un fichier Upload

Posté : 08 nov. 2010, 00:25
par AB
Bon voilà un code complet qui s'appuie sur cette classe

A la fin du message du lien ci-dessus tu trouveras la classe qu'il te suffit copier dans un fichier que tu nommeras par exemple "class_upload.php".

On fait appel à ce fichier à la première ligne du code ci-dessous.

Ensuite il te suffit d'indiquer les dossiers autorisés dans $dossiers_autorise comme dans l'exemple du code ci-dessous en deuxième ligne.

Et normalement tu n'as rien à faire d'autre pour que le code soit fonctionnel et t'affiche ce que tu souhaite et renomme les fichiers si d'autres de même nom sont déjà existants sur le serveur.
<?php 
//Si on travaille en utf-8
header('Content-type: text/html; charset=UTF-8');

require('class_upload.php');

//Liste de tes dossiers autorisés (sans caractères spéciaux ni accents, ni espaces)
$dossiers_autorise = array('film','photo','autre');


$dossier = $dossiers_autorise[0];

$erreur_dossier = null;
// Si le formulaire est envoyé on regarde si $_POST['categorie'] fait partie du tableau de dossiers autorisés
if(isset($_POST['form_envoi'],$_POST['categorie']))
{
        if (in_array($_POST['categorie'],$dossiers_autorise))
       
        $dossier = $_POST['categorie'];
       
        else
       
        $erreur_dossier = 'Vous devez choisir la catégorie';
}


if (empty($erreur_dossier))

        {
			//Utilisation de la classe de téléchargement (cf la doc pour plus de précisions)
			 $up = new Telechargement($dossier,'form_envoi','fich_upload','get_form');

			//Extensions autorisées
			$extensions = array("jpeg", "jpg");
			$up->Set_Extensions_accepte ($extensions);
			
			// Contrôle sur les images pour vérifier que les fichiers téléchargés sont bien des images
			$up->Set_Controle_dimImg();
			
			// Les fichiers seront renommés en cas de doublon avec une méthode incrémentale (pour changer la méthode d'incrémentation cf la doc).
			$up->Set_Renomme_fichier('incr');
			
			// Envoi des données et traitement de l'upload avec rechargement de la page pour éviter un multi upload en cas de rafraichissement de la page.
			$up->Upload('reload');
			
			// Récupération des messages d'information
			$resultat = $up->Get_Tab_message();
			
			// Récupération du tableau des résultats
			$transfert = $up->Get_Tab_upload();

         
       }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans nom</title>
</head>

<body>
<div>

<form enctype = "multipart/form-data" action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?get_form=1'?>" method = "post">  
<p>  
Catégorie : <select name="categorie" >
<option value="">Choisissez...</option>
<?php foreach ($dossiers_autorise as $value) echo '<option value="'.$value.'">'.$value.'</option>';?>

</select>

<br /> <br />
     
<input name = "fich_upload[]" type = "file" size = "70" />
                       
<input type = "submit" name = "form_envoi" value = "Envoyez"  />  
</p>  
</form>
    <div style="margin-top:20px;">
               
        <?php if (!empty($resultat))
       
        foreach ($resultat as $num)
            {
                foreach ($num as $value)
                 echo htmlspecialchars($value).'<br />';
            }

        if(isset($erreur_dossier)) echo $erreur_dossier;

        ?>
    </div>
	
<div>	
<?php //affichage du message

if (!empty ($transfert))
     {
		echo '<p>';
		$result = $transfert['resultat'];
	   
		foreach ($result as $num => $rep)
				{
					foreach ($rep as $key => $value)
							{                                                          
									if(!empty($value['nom']))                                  
										
										{
										    $dim = explode('x',$value['dim']);
										
											echo htmlspecialchars('code à insérer : <img src ="'.$key.'/'.$value['nom'].'" width="'.$dim[0].'" height="'.$dim[1].'" />') ;
										}
							}    
				}
		echo '</p>';	
	} 
?>
</div>
</div>
</body>
</html>
L'avantage d'utiliser cette classe est qu'elle possède une gestion complète des erreurs (fichiers trop gros, mauvaise extension des fichiers etc.)

Et puis par exemple au lieu de simplement télécharger les images tu pourrais très facilement les redimensionner si elle dépassent une taille maximale pour qu'elle restent compatibles avec l'affichage sur ton site.
Pour ce faire il suffirait de remplacer dans le code php ci-dessus la ligne
$up->Set_Controle_dimImg();
par
$up->Set_Redim ('800','600');
soit redimensionnement en max 800 de largeur et 600 de hauteur (bien entendu préserve les proportions)

Autre facilités, si tu veux permettre plusieurs upload simultanés il te suffit de mettre plusieurs fois la ligne
<input name = "fich_upload[]" type = "file" size = "70" />
sous celle déjà existante dans le code html ci-dessus

Et bien d'autre possibilités qui sont indiquées dans le mode d'emploi au début du message que je t'ai donné en lien.

Si tu veux en savoir plus sur le fonctionnement interne du code (entre autre la fonction de renommage) il y a ce tuto

Tiens-nous au courant de ton avancement :wink:

Re: Chemin d'un fichier Upload

Posté : 08 nov. 2010, 08:08
par Necromoine
Meeeeeerci, je pense que ca va beaucoup m'aider meme sije n'ai aucune idee de la facon dont cela marche...
Je vais essayer de comprendre avant de le mettre sur mon site, je vous tiens au courant.
Si j'ai une autre question sur un script que je suis en train d'ecrire faut il que je refasse un nouveau topic ??
C'est un changement de page "automatique" en fonction de nombre de page sur la page d'acceuil.
Si il y en a plus que 5 alors un bouton SUIVANT est crrer et permet d'afficher les autres news.

Re: Chemin d'un fichier Upload

Posté : 08 nov. 2010, 14:09
par AB
Si j'ai une autre question sur un script que je suis en train d'ecrire faut il que je refasse un nouveau topic ?
Oui un sujet par topic :wink:

Re: Chemin d'un fichier Upload

Posté : 09 nov. 2010, 21:20
par Necromoine
Merci, j'ai reussi a l'installer, mais j'obtient des erreurs .... bizarres, pour ne pas dire étranges.
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /www/zxq.net/t/u/t/tuto/htdocs/admin/class_upload.php:1181) in /www/zxq.net/t/u/t/tuto/htdocs/admin/class_upload.php on line 60

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /www/zxq.net/t/u/t/tutob/htdocs/admin/class_upload.php:1181) in /www/zxq.net/t/u/t/tuto/htdocs/admin/class_upload.php on line 60

Warning: Cannot modify header information - headers already sent by (output started at /www/zxq.net/t/u/t/tuto/htdocs/admin/class_upload.php:1181) in /www/zxq.net/t/u/t/tuto/htdocs/admin/class_upload.php on line
La ligne 1181 est la fin du doc et la ligne 60 un simple IF.
De plus session_start n'est present dans aucun des deux documents.

Pourriez vous m'aider ?

Re: Chemin d'un fichier Upload

Posté : 09 nov. 2010, 21:27
par necromoine
Edit :
J'ai ce probleme uniquement si je le met dans la zone "admin" si je le met a la racine du site, aucun probleme apparent...
De plus, les accents ne s'affichent pas, cela vient t'il du fait que je ne travaille pas en UTF-8 ?
J'obtiens une erreur si par contre je souhaite envoyé une image qui existe deja dans le dossier.
Il renome l'image, mais m'affiche un joli petit message d'erreur.

Re: Chemin d'un fichier Upload

Posté : 09 nov. 2010, 23:14
par AB
Pour ton premier message, dans un espace admin il doit y avoir des sessions (donc session_start quelque part)

Il est très probable que la classe (qui déclare une session) soit suivie d'un code (peut-être inclus) qui tente de déclarer une session.

C'est pour cette raison que quand on ne sait pas si d'autre code inclus vont ou non déclarer des sessions, il est préférable de faire
if (!session_id()) session_start();


Pour ton second message si tu ne travaille pas en utf-8 mais en iso-8859-1 il faut modifier deux lignes

1/Supprime la ligne header('Content-type: text/html; charset=UTF-8');

2/ remplace la ligne
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
par
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />


Et pour la dernière partie de ton message
J'obtiens une erreur si par contre je souhaite envoyé une image qui existe deja dans le dossier.
Il renome l'image, mais m'affiche un joli petit message d'erreur.
PRECISES quel message d'erreur il s'agit (copies- le moi), je ne suis pas devin :wink:

Re: Chemin d'un fichier Upload

Posté : 09 nov. 2010, 23:19
par AB
A oui contrôle aussi que le fichier class_upload.php se termine bien par ?>

Re: Chemin d'un fichier Upload

Posté : 10 nov. 2010, 00:02
par necromoine
Pour les erreurs, étant donnée que cela n'etait que des Warning, je me suis permis de mettre des @ devant.
Donc tout semble marcher.

Merci a vous.

----> Depuis que j'ai commencer le PHP j'utilise Mysqli, est-ce bien ? (j'ouvre un nouveau topic d'aide pour un systeme de news c'est pour ca.)

Re: Chemin d'un fichier Upload

Posté : 10 nov. 2010, 00:22
par AB
J'aimerais bien savoir quels sont ces messages d'erreur. Tu peux me les recopier ?

Devant quelles fonctions as-tu mis des @. Parce que les fonctions ne seront simplement pas exécutées et si elles étaient nécessaires...

Oui c'est recommandé d'utiliser mysqli (ou pdo) de préférence à mysql.