Gestionnaire d'images pour interface d'admin

Description

Je l'utilise sur mon site pour que les admins puissent envoyer leur propres images pour les news... Le bout de code correspondant à la page d'ajout de news est en commentaire à la fin du code !

Il gérè:
-La liste des images
-L'envoi (upload) d'images
-La copie depuis un autre site (via une requête HTTP)
-La supression (avec confirmation)
-La sélection avec aperçu depuis une autre page

Mais bon, rien ne vous empêche de l'utiliser pour autre chose que des images... Mais dans ce cas, il faudrait revoir le code de réception http.

Source / Exemple :


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML LANG="fr">
<HEAD>
  <TITLE>Console d'administration: Images</TITLE>
  <META HTTP-EQUIV="content-type" CONTENT="text/html; charset=iso-8859-1">
  <META HTTP-EQUIV="content-style-type" CONTENT="text/css">
  <META HTTP-EQUIV="content-script-type" CONTENT="text/javascript">
  <META NAME="author" CONTENT="Elektordi">
</HEAD>
<body>
<h1 align="center">Console d'administration: Images</h1>
  
 <?
 
 $script_name = "gestion_images.php";
 $repertoire = "images/";
 
 if($mode=="copy") // Copier une image depuis une URL
 {

	echo "<h2>Copie d'image</h2>\n";
	
	$er=0;
	if(!preg_match('/^(http:\/\/)?([\w\-\.]+)\:?([0-9]*)\/(.*)$/', $url, $url_ary)) $er=1;
	if(empty($url_ary[4])) $er=1;
	
	if($er==1) {
?><form name="form1" method="post" action="<? echo $script_name; ?>">
<p><b><font color="red">URL incomplète:</font></b>    
  <input name="url" type="text" id="url" size="100" value="<? echo $url; ?>">
    <input type="submit" name="Submit" value="Copier">
    <input name="mode" type="hidden" id="mode" value="copy"> 
   <a href="<? echo $script_name; ?>">Annuler</a></p>
</form>
 <?
	}
	else
	{
		$maxsize = 100000;
		
		$base_filename = substr($url_ary[4],strrpos($url_ary[4],"/")+1);
	
		$base_get = '/' . $url_ary[4];
		$port = ( !empty($url_ary[3]) ) ? $url_ary[3] : 80;

		if($base_filename=="") die("<h2>Impossible de télécharger l'image...</h2><p>Erreur de récupération du nom.</p></body></html>");

		if ( !($fsock = fsockopen($url_ary[2], $port, $errno, $errstr)) )
		{
			die("<h2>Impossible de télécharger l'image...</h2><p>Pas de connexion.</p></body></html>");
		}

		fputs($fsock, "GET $base_get HTTP/1.1\r\n");
		fputs($fsock, "Host: " . $url_ary[2] . "\r\n");
		fputs($fsock, "Accept-Language: fr\r\n");
		fputs($fsock, "Accept-Encoding: none\r\n");
		fputs($fsock, "User-Agent: PHP\r\n");
		fputs($fsock, "Connection: close\r\n\r\n");

		unset($data);
		while( !feof($fsock) )
		{
			$data .= fread($fsock, $maxsize);
		}
		fclose($fsock);

		if (!preg_match('#Content-Length\: ([0-9]+)[^ /][\s]+#i', $data, $file_data1) || !preg_match('#Content-Type\: image/[x\-]*([a-z]+)[\s]+#i', $data, $file_data2))
		{
			die("<h2>Impossible de télécharger l'image...</h2><p>Aucune donnée.</p></body></html>");
		}

		$filesize = $file_data1[1]; 
		$filetype = $file_data2[1]; 

		if ( !$error && $filesize > 0 && $filesize < $maxsize )
		{
			$data = substr($data, strlen($data) - $filesize, $filesize);

			$filename = $repertoire.$base_filename;

			if(file_exists($filename)) echo "<p>Le fichier de destination ".$base_filename." existe déjà !</p>";
			else
			{
				$fptr = fopen($filename, 'wb');
				$bytes_written = fwrite($fptr, $data, $filesize);
				fclose($fptr);
		
				if ( $bytes_written != $filesize )
				{
					unlink($tmp_filename);
					die("<h2>Impossible de télécharger l'image...</h2><p>Echec d'écriture.</p></body></html>");
				}
				echo "<p>".$base_filename." enregistré avec succès ! <img src='".$repertoire.$base_filename."'></p>";
			}
		}
		else
		{
			die("<h2>Impossible de télécharger l'image...</h2><p>Fichier trop gros.</p></body></html>");
		}
	}
 }
 
 if($mode=="upload") // Envoyer une image
 {
	
	echo "<h2>Upload d'image</h2>\n";
	
	$extensions_ok = array('png', 'gif', 'jpg', 'jpeg'); 
	$taille_max = 100000;  
	// vérifications 
	if( !in_array( strtolower(substr(strrchr($_FILES['file']['name'], '.'), 1)), $extensions_ok) ) 
	{ 
		$erreur = 'Veuillez sélectionner un fichier de type png, gif ou jpg !'; 
	} 
	elseif( file_exists($_FILES['file']['tmp_name']) 
		and filesize($_FILES['file']['tmp_name']) > $taille_max) 
	{ 
		$erreur = 'Votre fichier doit faire moins de 500Ko !'; 
	} 
	// copie du fichier 
	if(!isset($erreur)) 
	{ 
		$dest_fichier = basename($_FILES['file']['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-1]+)/i', '_', $dest_fichier); 
		//vérif
		if(file_exists($repertoire.$dest_fichier)) echo "<p>Le fichier de destination existe déjà !</p>";
		else {
			// copie du fichier 
			move_uploaded_file($_FILES['file']['tmp_name'], $repertoire.$dest_fichier); 
			echo "<p>".$dest_fichier." envoyé avec succès ! <img src='".$repertoire.$dest_fichier."'></p>";
		}
	} 
	else{ 
		echo "<p>".$erreur."</p>"; 
	} 
	
 }
 
 if($mode=="del") // Supprimer une image
 {
 	if(!isset($file)) die("<h2>Aucun nom de fichier !</h2></body></html>");
	
	if(!file_exists($repertoire.$file)) die("<h2>Fichier inexistant !</h2></body></html>");
	
	if(isset($confirm))
	{
		if($confirm+10<time()) die("<h2>L'action a expirée...</h2></body></html>");
	
		unlink($repertoire.$file);
	
		echo "<h2>Entrée supprimée !</h2>";
	}
	else
	{
		echo "<h2>Supression d'une image ?</h2>\n";
		echo "<p>Vous êtes sur le point de supprimer l'image '".$file."' qui ressemble à ça: <img src='".$repertoire.$file."'><br>";
		echo "<b>Etes-vous sûr de vouloir continuer ?<br><font size=\"5\">";
		echo "<a href='".$script_name."?mode=del&file=".$file."&confirm=".time()."'><font color='red'>Oui</font></a> - ";
		echo "<a href='".$script_name."'><font color='green'>Non</font></a></font></b></p>\n";
	}
 }
 ?>
 
<h2>Ajout d'images</h2>
<form name="form1" method="post" action="<? echo $script_name; ?>">
<p>Copier une image depuis une URL: 
    <input name="url" type="text" id="url" value="http://www.clonk.de/news/news_???.gif" size="100">
    <input type="submit" name="Submit" value="Copier">
    <input name="mode" type="hidden" id="mode" value="copy">
</p>
</form>
<form action="<? echo $script_name; ?>" method="post" enctype="multipart/form-data" name="form2">
<p>Envoyer une image:
  <input name="file" type="file" size="100">     
  <input type="submit" name="Submit" value="Envoyer">
  <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
  <input name="mode" type="hidden" id="mode" value="upload">
</p>
</form>
<h2>Liste des images</h2>
<?
	$dossier=opendir($repertoire); 
    while ($fichier = readdir($dossier)) { 
        if(is_dir($fichier)) continue;
		$s="";
		if($fichier==$val) $s=" selected";
		echo "<p>".$fichier." = <img src='".$repertoire.$fichier."'> [ <a href='".$script_name."?mode=del&file=".$fichier."'>Supprimer</a> ]</p>";
    } 
	
?>
<h2>Fini ?</h2>
<p>Alors on retourne à l'<a href="admin.php">index de l'administration</a>... </p>
</body>
</html>

<?
/*
Voici le code à mettre dans une autre page pour sélectionner l'image:

<?
$repertoire="images/";

 function put_imgselector($name, $val)
 {
 	echo "<select name='".$name."' onchange=\"preview('".$name."');\">\n";
	echo "<option value=''>---AUCUNE---</option>\n";
	$dossier=opendir($repertoire); 
    while ($fichier = readdir($dossier)) { 
        if(is_dir($fichier)) continue;
		$s="";
		if($fichier==$val) $s=" selected";
		echo "<option value='".$fichier."'".$s.">".$fichier."</option>\n";
    } 
 	echo "</select>   <img id='".$name."_prv' src='".$repertoire.$val."' border='1'>\n";
 }
 
?>

<script language="JavaScript" type="text/JavaScript">
function preview(name)
{
	var img;
	img = document.getElementById(name).value;
	document.getElementById(name+"_prv").src="<? echo $repertoire; ?>"+img;
}
</script>

---Code formulaire---
Image : <? put_imgselector("img_g", $img_g); ?>
---Fin formulaire---

  • /
// Voila ! C'est tout... //Elektordi ?>

Conclusion :


Comme c'est prévu pour une interface d'admin, il n'y a pas de sécuritées ni de vérifications...

Pour ce code, je me suis inspiré de
-Anciens codes à moi
-http://www.phpcs.com/codes/UPLOAD-FICHIERS_31345.aspx
-sources de phpbb

Pour ce dernier, je remercie celui qui a écrit le script de gestion des avatars car un code de copie d'images/de fichiers avec une URL, c'est rare... (en tout cas y'avait rien sur PHP-CS !)

N'hésitez pas à commenter ma source.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.