Upload / ajout / suppression de fichier sur votre site

Contenu du snippet

A l'usage et à la recherche, je n'ai pas trouvé de chose toute faites (mais sais-je chercher ?)...
Donc je m'y suis mis en rassemblant des bout de code et d'information, et j'ai réalisé un bloc réutilisable de fichiers PHP afin de gèrer les upload de mes utilisateurs, et de leur permettre de gérer leur fichiers uploadés.
Bref, à défaut d'être original ou utile, il vous évitera peut-être tous les pièges dans lesquels je suis tombé

Principe :
1/ avoir les droits (777 ?) sur le répertroire de stockage des fichiers
2/ connaitre le PATH complet de son site web
3/ mettre les fonctions qui contiennent les commandes unix de gestion de fichier dans ce-dit répertoire de stockage
4/ avoir une bdd avec un table USER (ou autre...), une table DOCUMENT...

Fonctionnement :
Ce bloc contient 3 fichiers :
- 99999999999.php : qui contient les 2 fonctions de gestion de fichier
- etat_des_upload.php : qui contient le process de contrôle des fichiers à uploader et les requêtes de m.a.j. de la BdD selon les besoins
- formulaire.php : qui est un extrait du fichier de traitement du formulaire qui contient le input de type FILE.

Source / Exemple :


Dans un fichier quelconque il y a un formulaire : <form name="formulaire" enctype="multipart/form-data" method="post" action="FORMULAIRE.PHP">
IMPORTANT le enctype pour le FILE !
il y a un imput : <input type="file" name="p_coll_draft">

FORMULAIRE.PHP
_________
... blabla
		include ("../leurs_fichiers/99999999999.php");//j'aurais besoin, des fonctions bientôt
		if($il_existe_deja_un_fichier_en_bdd_pour_l_utilisateur){// modifier, donc d'abord supprimer l'ancien fichier
			$enregistre=F_PurgePla($old_plak);//je supprime le fichier existant
			if($enregistre){// s'il a bien été supprimé
				echo "<blockquote><br>Fichier supprimé.<br></blockquote>";
				mysql_db_query($sql_bdd,"delete from user_doc where UD_ID=$id_du_vieux_fichier",$db_link) or die(mysql_error());// je mets à jour en BdD
				}
			else{
				echo "<blockquote><br>Erreur de traitement ; fichier pas vu, pas pris, pas supprimé.<br></blockquote>";
				}
			}
		// maintenant il s'agit de créer ou recréer un nouveau avec la nouvelle valeur venant du POST
		if(strlen($_FILES['p_coll_draft']['name'])>4){// le fichier mis doit avoir un nom de + de 4 caractères de long... 
			// j'affecte les données de $_files à mes variables de travail
			$pnom=$_FILES['p_coll_draft']['name'];
			$pnomtmp=$_FILES['p_coll_draft']['tmp_name'];
			$ptypemine=$_FILES['p_coll_draft']['type'];
			$ptaille=$_FILES['p_coll_draft']['size'];
			$perror=$_FILES['p_coll_draft']['error'];
			// j'ajoute un document à l'utilisateur courant ($id_user), car j'ai besoin de l'ID du document en bdd pour renommer le fichier envoyé
			$reket_i_doc="insert into user_doc (UD_ID, U_ID, UD_TYPE, UD_PATH, UD_DATE) values (\"\",\"$id_user\", 0,\"\",\"$date_heure\")";
			echo "$reket_i_doc<br>";// pour voir ce qui se passe
			mysql_db_query($sql_bdd,$reket_i_doc,$db_link) or die(mysql_error());
			$id_plaket=mysql_insert_id();
			include ("etat_des_plaket_up.php");
		}
... blabla

ETAT_DES_UPLOAD.PHP
_________
<?PHP
if(is_uploaded_file($pnomtmp) && strlen(trim($pnom))>4 && strlen(trim($pnom))<255){//je contrôle que j'ai bien kelke chose de sérieux à traiter
	echo "arrive avec $pnom en $pnomtmp<br>";// pour info debbug
	$testoki=0;// variable de réussite des tests
	if($ptaille>400000){// la taille doit être inférieure à 400 Ko
		echo "<p><blockquote>$tas_aff[erreurpathlong]</blockquote></p><br>";// message d'erreur
		$testoki=$testoki+1;
		}
	$extensiondoc=strrchr($pnom, ".");//on doit pouvoir faire ca avec '$ptypemine', mais je suis comme Saint-Thomas... Incrédule.
	echo "extension : $extensiondoc<br>";// pour info debbug
	$extensionmax=array('.jpg','.jpeg','.gif','.htm','.html','.txt','.xls','.doc','.pdf','.rtf','.ppt','.png','.JPG','.JPEG','.GIF','.HTM','.HTML','.TXT','.XLS','.DOC','.PDF','.RTF','.PPT','.PNG');// limite des extensions autorisées
	if(!in_array($extensiondoc,$extensionmax)){// si l'extension est interdite (pas autorisée en fait !)
		echo "<p><blockquote>$tas_aff[erreurpathext]</blockquote></p><br>";// message d'erreur supplémentaire
		$testoki=$testoki+1;
		}
	else{
		$minemax=array('application/msword','application/msexcel','application/mspowerpoint','application/pdf','image/gif','image/jpeg','image/png','image/tiff','text/plain','image/bmp','application/vnd.ms-powerpoint', 'application/vnd.ms-word','application/vnd.ms-excel');
		if (function_exists ('mime_content_type')){$minemagic=mime_content_type('$pnom');}
		else{$minemagic=$ptypemine;}
		if(!in_array($minemagic,$minemax)){
			echo "<p><blockquote>-2 $tas_aff[erreurpathext]</blockquote></p><br>";
			$testoki=$testoki+1;
			}
		}
	if($testoki==0){// si il n'y a pas d'erreur
		$nom_plus=$id_user*$id_user;// je créé un nom
		$nomnouvodoc="fichier_a_".$nom_plus."_".$id_plaket.$extensiondoc;
		echo "F_StockPla ($pnomtmp,$nomnouvodoc)<br>";// pour les tests de debbug, toujours...
		$enregistre=F_StockPla($pnomtmp,$nomnouvodoc);// je stocke
		if ($enregistre){// si j'ai bien réussi à stocker le fichier
			$pathstock="../leurs_fichiers/".$nomnouvodoc;// path de stockage
			// update en bdd....
			$reket_u_user="update user set U_FICHIER=\"$id_plaket\" where U_ID=\"$id_user\"";}// l'utilisateur
			echo "$reket_u_user<br>";// pour le debbug
			mysql_db_query($sql_bdd,$reket_u_user,$db_link) or die(mysql_error());
			$reket_u_doc="update user_doc set UD_PATH=\"$pathstock\" where UD_ID=$id_plaket";// le document
			echo "$reket_u_doc<br>";// pour le debbug
			mysql_db_query($sql_bdd,$reket_u_doc,$db_link) or die(mysql_error());
			echo "<p><blockquote>$tas_aff[confirmpathenreg]</blockquote></p><br>";//confirme enregistrement
			}
		else{// je supprime donc le doc ajouté en BdD
			$reket_d_doc="delete user_doc  where UD_ID=$id_plaket";// le document
			echo "$reket_d_doc<br>";// pour le debbug
			mysql_db_query($sql_bdd,$reket_d_doc,$db_link) or die(mysql_error());
			echo "<p><blockquote>$tas_aff[erreurpathenreg]</blockquote></p><br>";}//message d'erreur sur enregistrement
			}
	else{echo "<p><blockquote>$tas_aff[erreurpath]</blockquote></p><br>";}
	}
else{
	echo "<blockquote><br>Erreur inconnue durant le téléchargement du fichier. Veuillez prévenir le Webmaster.<br></blockquote>";
	}
?>

99999999999.PHP
__________________
<?
function F_StockPla($doc,$nomdoc)// Attention !!!!!! $doc NE contient PAS le répertoire de stockage du fichier à enregistrer
	{
	//echo "nom d'origine du fichier : $pnom, Nom temporaire du fichier : $pnomtmp, type MIME du fichier : $ptypemine, taille du fichier : $ptaille, error : $perror<br>"
	$path_doc="/homepage/F/d54513f1d5/htdocs/www/leurs_fichiers/".$nomdoc;//changement de nom
	//echo "stockdoc, met $doc là : $path_doc<br>";
	$stock=move_uploaded_file($doc,$path_doc);
	if($stock){return true;}
	else{return false;}
	}
function F_PurgePla($doc)// Attention !!!!!! $doc contient le répertoire de stockage du fichier à supprimer
	{
	echo "rentrer dans PurgePla : $doc";
	echo "arrive ($doc) pour '/homepage/F/d54513f1d5/htdocs/www/'".$doc."<br>";
	$efface=unlink('/homepage/F/d54513f1d5/htdocs/www/'.$doc);
	if($efface){return true;}
	else{return false;}
	}	
?>

Conclusion :


Si vous voulez utiliser ce code, il faut refaire :
- vos propres requêtes.
- votre algo de test pour savoir si c'est une création de fichier, un remplacement ou une suppression. Je vous ais donné le bloc Remplacement / création, partant du principe qu'un remplacement = suppression + création
- modifier les données PATH et répertoires

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.