Problème d'accent dans un upload

Eléphant du PHP | 104 Messages

11 mai 2009, 10:38

Bonjour à tous.

Alors voila mon petit soucis, j'ai un formulaire avec possibilité d'envoi de fichiers. Tout est stocké dans ma BDD et ensuite je peux le récuperer. Petit hic, si une personne upload un fichier avec des accents, (par exemple idée.txt je vais avoir => idée.txt dans ma BDD et aussi le fichier que j'aurai récupéré sera nommé idée.txt.. ) ces derniers sont remplacés par des caracteres qui me plaise pas xD.

Je suppose que je dois faire quelque chose qui dis que si il y a un accent il remplace la lettre par une qui en a pas (exemple : é, è, ê => e). Seul poblème je ne vois pas comment faire..

Donc voici mon code :
<?php

	// Connexion au serveur
	include 'connectbdd.php';
	
			//On teste si le formulaire est validé
			if(isset($_POST['ok'])){
				
				if(!empty($_POST['nom']) && !empty($_POST['prenom']) && !empty($_POST['mail'])){

				// Teste si le fichier a bien été envoyé et s'il n'y a pas d'erreur
				if (isset($_FILES['cv']) AND $_FILES['cv']['error'] == 0)
				{
						// Teste si le fichier n'est pas trop gros
						if ($_FILES['cv']['size'] <= 5242880)
						{
								// Teste si l'extension est autorisée
								$infosfichier = pathinfo($_FILES['cv']['name']);
								$extension_upload = $infosfichier['extension'];
								$extensions_autorisees = array('txt', 'doc', 'xls', 'xlsx', 'docx');
								if (in_array($extension_upload, $extensions_autorisees))
								{		
										$nom = $_POST['nom'];
										// On peut valider le fichier et le stocker définitivement
										move_uploaded_file($_FILES['cv']['tmp_name'], "cv/$nom"."_" . basename($_FILES['cv']['name']));
										//echo "L'envoi a bien été effectué !";
										$cv = "cv/$nom"."_".$_FILES['cv']['name'];
										
										$prenom = $_POST['prenom'];
										$mail = $_POST['mail'];
										$contenu = $_POST['contenu'];
													
										//Mise à jour de l'image
										$sql = "INSERT INTO recrutement (nom,prenom,mail,cv,contenu) VALUES ('$nom' , '$prenom' , '$mail' , '$cv' , '$contenu')";
										mysql_query($sql) or die(mysql_error());
								}
								else{
									echo "L'extension de votre fichier est incorrecte";
								}
						}
						else{
							echo "Votre fichier est trop lourd.";
						}
						
				
				}
				else{
					echo "Problème d'envoi du fichier joint, veuillez contacter l'administrateur du site";
				}
			}
			else{
				echo "Merci de remplir tout les champs obligatoire";
			}
		}
?>
Merci pour votre aide

Eléphant du PHP | 250 Messages

11 mai 2009, 10:51

Bonjour
C'est la fonction preg_replace qui fera ça très bien...MAIS attention, je ne sais pas si tu es en utf_8 et si ta base aussi, mais dans ce cas, le problème peut aussi venir de cette dernière (Mysql ne gère pas ça de la même manière); ceci dit, si tu remplace au moment de l'upload les accents par une lettre sans accent, ton pb sera résolu.... :lol:
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Eléphant du PHP | 104 Messages

11 mai 2009, 11:12

Merci pour ton aide.

J'ai donc fait ça :
$nom = $_POST['nom'];
										// On peut valider le fichier et le stocker définitivement
										move_uploaded_file($_FILES['cv']['tmp_name'], "cv/$nom"."_" . basename($_FILES['cv']['name']));
										//On remplace les E avec accent par un E normal
										$e = array("é", "è", "ê", "ë");
										$cv = preg_replace ($e, "e", $cv);

										//echo "L'envoi a bien été effectué !";
										$cv = "cv/$nom"."_".$_FILES['cv']['name'];
Malheureusement sa ne fonctionne pas..

ViPHP
ViPHP | 1136 Messages

11 mai 2009, 11:24

Slt ,

Dans ton code , tu essayes de traiter $cv , avant même de l'avoir définie ?
$cv = preg_replace ($e, "e", $cv);

//echo "L'envoi a bien été effectué !";
$cv = "cv/$nom"."_".$_FILES['cv']['name'];


essayes plutôt avec ce genre de syntaxe
// replace les caractères accentués 
    $accents = '/&([A-Za-z]{1,2})(grave|acute|circ|cedil|uml|lig);/';

    //echo "L'envoi a bien été effectué !";
    $string = "cv/$nom"."_".$_FILES['cv']['name'];

    //permet entre autre de t'éviter quelques injections de code
    $string_encoded = htmlentities($string,ENT_NOQUOTES,'UTF-8');

    $string = preg_replace($accents,'$1',$string_encoded);



Change UTF-8 par l'encodage que tu utilises s'il est different d'utf-8

Ch.

Eléphant du PHP | 104 Messages

11 mai 2009, 11:33

Toujours pas..
// On peut valider le fichier et le stocker définitivement
										move_uploaded_file($_FILES['cv']['tmp_name'], "cv/$nom"."_" . basename($_FILES['cv']['name']));
										
										// replace les caractères accentués 
										$accents = '/&([A-Za-z]{1,2})(grave|acute|circ|cedil|uml|lig);/';
										$string_encoded = htmlentities($string,ENT_NOQUOTES,'UTF-8');
										$string = preg_replace($accents,'$1',$string_encoded); 

										//echo "L'envoi a bien été effectué !";
										$cv = "cv/$nom"."_".$_FILES['cv']['name'];
Undefined variable: string in C:\wamp\www\recrute\index.php on line 29
Je suis bien en utf-8 sur mon code et phpmyadmin

[EDIT] : Je viens de voir que tu as modifier ton post pendant que je posté, je refais donc des modifs

[EDIT 2] : Youpi sa fonctionne correctement ^^. Merci beaucoup pour votre aide.

ViPHP
ViPHP | 1136 Messages

11 mai 2009, 11:38

Encore une fois , tu traite la chaine avant de l'avoir défini !!!!!

PAS BON:

// On peut valider le fichier et le stocker définitivement
move_uploaded_file($_FILES['cv']['tmp_name'], "cv/$nom"."_" . basename($_FILES['cv']['name']));
                                        
// replace les caractères accentués 
$accents = '/&([A-Za-z]{1,2})(grave|acute|circ|cedil|uml|lig);/';
$string_encoded = htmlentities($string,ENT_NOQUOTES,'UTF-8');
$string = preg_replace($accents,'$1',$string_encoded); 

//echo "L'envoi a bien été effectué !";
$cv = "cv/$nom"."_".$_FILES['cv']['name'];
NORMALEMENT BON: :D

// On peut valider le fichier et le stocker définitivement
move_uploaded_file($_FILES['cv']['tmp_name'], "cv/$nom"."_" . basename($_FILES['cv']['name']));
           
//définition de $cv AVANT TRAITEMENT
$cv = "cv/$nom"."_".$_FILES['cv']['name'];
                             
// replace les caractères accentués 
$accents = '/&([A-Za-z]{1,2})(grave|acute|circ|cedil|uml|lig);/';
$string_encoded = htmlentities($cv,ENT_NOQUOTES,'UTF-8');
$cv = preg_replace($accents,'$1',$string_encoded); 

//echo "L'envoi a bien été effectué !";

Eléphant du PHP | 104 Messages

11 mai 2009, 11:55

Ouais pas trop réflichi..

Par contre je viens de voir un probleme, mais qui ne viens pas du php je pense (a verifier)

Quand je fais l'upload, les accents du fichier sont bien remplacé (meme dans la BDD je le vois ecrit sans accents) cependant mon fichier en lui même ne ce modifie pas (du coup quand je veux recuperer le fichier par un lien, vu qu'il prend le lien url de la BDD, l'adresse n'est plus le meme.. Celui de la BDD est par exemple : idee_site.txt et celui uploader dans le fichier idée_site.txt).

Une petite idée ?

ViPHP
ViPHP | 1136 Messages

11 mai 2009, 11:58

Tu fais le même traitement des accents au second paramètre de :

move_uploaded_file();

donc :
//définition de $cv AVANT TRAITEMENT
$cv = "cv/$nom"."_".$_FILES['cv']['name'];

// replace les caractères accentués 
$accents = '/&([A-Za-z]{1,2})(grave|acute|circ|cedil|uml|lig);/';
$string_encoded = htmlentities($cv,ENT_NOQUOTES,'UTF-8');
$cv = preg_replace($accents,'$1',$string_encoded); 

// On peut valider le fichier et le stocker définitivement
move_uploaded_file($_FILES['cv']['tmp_name'], $cv);

//echo "L'envoi a bien été effectué !";

Eléphant du PHP | 104 Messages

11 mai 2009, 13:22

Yeah sa fonctionne correctement.

Je vous remercie pour votre aide.