Haaaa nolem, mon clark kent

Heu....

...
Je veux pas de problème avec les voisins...
En complément de l'explication de Ryle, je rajouterai ceci (je vais faire court

) :
Lorsque tu « upload » un fichier sur le serveur, l'élément
form aura obligatoirement l'attribut :
* action qui pointera soit dans le même fichier ou dans un autre, (À noter que dans le même fichier, cela rend la tâche plus aisée)
* method avec la valeur post
* enctype avec la valeur multipart/form-data (encodage des données envoyées)
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post" enctype="multipart/form-data">
<fieldset>
<legend>envoie de fichiers</legend>
<p>
<label for="id_image">image : </label>
<input type="file" name="image" id="id_image" />
<input type="hidden" name="max_file_size" value="200000" /> <!-- valeur exprimée en octets -->
<input type="hidden" name="__envoi" value="__ok" />
<input type="submit" name="envoyer" value="envoyer" />
</p>
</fieldset>
</form>
Traiter un formulaire d'upload de fichier est quelque chose à prendre avec beaucoup d'attention et d'une manière générale, ne jamais faire confiance à l'utilisateur y compris toi (!). Lorsque le formulaire est soumis la super-globale $_POST ne te sera pas d'une grande aide (sauf au contrôle de soumission du formulaire). Ce sera la super-globale $_FILES. Pour rappel, une super-globale peut être appelée dans n'importe quel endroit du code. $_FILES est un tableau à deux dimensions et de type associatif.
$_FILES["image"]["name"] = "bg_temp.jpg"; // le nom de départ du fichier
$_FILES["image"]["type"] = image/jpeg; // le type MIME du fichier uploadé
$_FILES["image"]["tmp_name"] = "C:\wamp\tmp\php24D3.tmp"; // Là où le fichier est placé temporairement. (cf. Ryle)
$_FILES["image"]["error"] = 0; //Est ce qu'il y a eu une erreur lors de l'envoi sur le serveur ? À noter que la valeur exprimée renvoie sur un code exprimé par des constantes (http://fr2.php.net/manual/fr/function.constant.php).
$_FILES["image"]["size"] = 14441; // le poids du fichier envoyé exprimé en octets.
Lors de l'envoi du formulaire, comment connaître toutes ces informations ? Tu vas avoir besoin de l'élément html
pre et de la fonction native PHP
print_r. ton code devrait avoir à peu près cette gueule là :
<?php
function debug($x){
echo "<pre>";
print_r($x);
echo "</pre>";
}
if(isset($_POST["__envoi"]) && $_POST["__envoi"] == "__ok"){
debug($_FILES);
}
?>
<form action="<?php echo htmlspecialchars("controle.php"); ?>" method="post" enctype="multipart/form-data">
<!-- etc. -->
Maintenant que tu as vu que donne l'array $_FILES, il va falloir coder tout ça.
Dans un premier temps, récupération des erreurs, s'il y a et faire des tests afin de savoir si le fichier s'est bien envoyé ou qu'il n'y a pas de problème. Cela donne un truc du style pour le début (nous y reviendrons un peu plus loin sur cette structure) :
//récupération du code erreur s'il y a...
$erreur[] = $_FILES["image"]["error"];
if($erreur[0] == UPLOAD_ERR_OK){
}else{
}
Ce qui revient à dire, si $erreur est égale ( « == » ) à zéro, ..., sinon ... (je ne parle pas de la clef [0])
Partons du principe qu'il y eu aucune erreur lors du transfert du fichier, il te reste à faire les autres filtres d'usages :
* Est ce que le nom du fichier est correct ?
* Est ce que l'extension du fichier attendue est correcte ?
* Est ce que le transfert du fichier dossier tmp au dossier personnel s'est bien déroulé ?
Pour toutes ces énumérations, il va falloir une fonction pour chacune et réunir le tout. Au passage, une fonction personnelle ne fait qu'une seule et unique chose.

nom du fichier correct ?
function nettoyer_nom_fichier($nom){
$caractere_depart = "ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ";
$caractere_sortie = "AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy";
//remplace caracteres erronés
$nom = strtr(basename($_FILES[$nom]["name"]),$caractere_depart,$caractere_sortie);
//remplace les caracteres autres que lettres, chiffres et point par _ et retourne la valeur obtenue
return preg_replace('/([^.a-z0-9]+)/i', '_', $nom);
}
extension fichier attendue :
function verification_extension_image($nom){
$extension_acceptee = array(
"gif",
"jpg",
"jpeg"
);
//récupération de l'extension
$pos_dernier_point = strrpos($_FILES[$nom]["name"],".");
$extension_fichier_form = strtolower(substr($_FILES[$nom]["name"],$pos_dernier_point + 1));
//extension trouvée ?
return (!in_array($extension_fichier_form,$extension_acceptee))? "Extension de fichier non autorisé" : 0 ;
}
La dernière ligne (conditionnelle ternaire) retourne une valeur 0 si tout s'est bien passé. Cela revient à dire ceci :
if(!in_array($extension_fichier_form,$extension_acceptee)){
$erreur = 0;
}else{
$erreur = "Extension de fichier non autorisé";
}
return $erreur;
transfert dans le dossier personnel :
function transfert_fichier_rep_perso($dossier_temp, $destination,$nom){
//test si le transfert est ok
return(@move_uploaded_file($dossier_temp,$destination.$nom) == false)? "transfert du fichier ".$nom." au dossier impossible" : "fichier ".$nom." envoyé sur le serveur" ;
}
Nous arrivons à la fonction qui va contrôler si tout se déroule bien. Il manque plus qu'à ficeler le tout. (Heu..., s'il y en a plus je vous l'emballe ?

)
function controle_envoi_image($nom_input){
//récupération du code erreur s'il y a...
$erreur[] = $_FILES[$nom_input]["error"];
//verification du transfert fichier vers le serveur
if($erreur[0] !== UPLOAD_ERR_OK){
switch($erreur[0]){
case UPLOAD_ERR_NO_FILE :
$erreur[] = "Aucun fichier a été transmis au serveur.";
break;
case UPLOAD_ERR_INI_SIZE :
$erreur[] = "Le fichier dépasse la taille max. autorisé par le serveur."; //par php en fait. voir la config je crois ou mettre une directive.
break;
case UPLOAD_ERR_FORM_SIZE :
$erreur[] = "Le fichier dépasse la taille max. (".($_POST["MAX_FILE_SIZE"] / 1000)." ko) autorisé par le formulaire.";
break;
case UPLOAD_ERR_PARTIAL :
$erreur[] = "Le fichier a été transmis partiellement au serveur.";
break;
default :
$erreur[] = "erreur de traitement du formulaire envoi fichiers";
}
//vérification en rapport au fichier uploadé (ext - dimension - valeur - etc.)
}else{
//erreur de traitement de transfert au dossier perso
$erreur[] = verification_extension_image($nom_input);
}
//si erreur : affiche les erreurs
//sinon transfert le fichier dans le bon dossier avec le nouveau nom
if(!preg_match("#^0+$#",implode("",$erreur))){
echo "<p>erreur(s) de traitement trouvée(s) : </p>";
echo "<ul>";
for($i = 0 ; $i < count($erreur) ; $i++){
echo (!is_int($erreur[$i]))? "<li>".$erreur[$i]."</li>" : "" ;
}
echo "</ul>";
return false;
}else{
return true;
}
}