<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Vincent Mazenod, aka mazenovi, aka voisin de gennetines &#187; javascript</title>
	<atom:link href="http://blog.mazenod.fr/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mazenod.fr</link>
	<description>#symfony #ispcp #iphone #php #cornemuse</description>
	<lastBuildDate>Mon, 05 Apr 2010 17:35:26 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Le caractère &#8216; dans les noms de fichiers pour un formulaire d&#8217;upload</title>
		<link>http://blog.mazenod.fr/2007/01/le-caractere-dans-les-noms-de-fichiers-pour-un-formulaire-d-upload/</link>
		<comments>http://blog.mazenod.fr/2007/01/le-caractere-dans-les-noms-de-fichiers-pour-un-formulaire-d-upload/#comments</comments>
		<pubDate>Wed, 31 Jan 2007 10:42:14 +0000</pubDate>
		<dc:creator>mazenovi</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://blog.mazenod.fr/?p=1</guid>
		<description><![CDATA[J&#8217;ai écrit il y a quelques mois déjà une petite appli visant à aider le service des marchés publics dde l&#8217;Université d&#8217;Auvergne, dans son processus de dématèrialistaion des marchés. En gros Un outil en Intranet avec fonctionnalités CRUD (Create Read Update Delete) permettant de gérer des marchés et leur état (appel d&#8217;offres, en cours, terminé).
Pour [...]]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai écrit il y a quelques mois déjà une petite appli visant à aider le service des marchés publics dde l&#8217;Université d&#8217;Auvergne, dans son processus de dématèrialistaion des marchés. En gros Un outil en Intranet avec fonctionnalités CRUD (Create Read Update Delete) permettant de gérer des marchés et leur état (appel d&#8217;offres, en cours, terminé).<br />
Pour un marché on peut attahcer des fichiers, via un formulaire d&#8217;upload HTML.<br />
Du genre:</p>
<pre name="code" class="html:nogutter">&lt;form id="FileForm" action="MarcFileCopy.php"
method="POST"  Enctype="multipart/form-data"&gt;
   Titre : &lt;input type="text" name="Titre" size="50" /&gt;
   &lt;input type="file" id="Fichier" name="Fichier" value="" size="80" /&gt;
   &lt;input type="hidden" name="MAX_FILE_SIZE" value="1000000" /&gt;
   &lt;input type="hidden" name="SubFile" value="Soumettre" /&gt;
   &lt;/form&gt;
</pre>
<p>Il se trouve que le service des marchés utilisent, de manière réccurrente, des caractères spéciaux dans leur nom de fichier, ce qui fait éventuellement des urls encodés d&#8217;une part pas belle te qui selon les caractères fonctionnent plus ou moins &#8230; Pour tout ce qui est caractère alphabétique et espacement, j&#8217;ai fait une fonction qui les chasses avant la copie du fichier sur le serveur du genre :</p>
<pre name="code" class="php:nogutter">
function antiSpecialChars($filename)
{
   $temp = $filename;
   $pattern = "[àâ]";
   $temp = eregi_replace($pattern,"a",$temp);
   $pattern = "[éèêë]";
   $temp = eregi_replace($pattern,"e",$temp);
   $pattern = "[î]";
   $temp = eregi_replace($pattern,"i",$temp);
   $pattern = "[ô]";
   $temp = eregi_replace($pattern,"o",$temp);
   $pattern = "[ ]";
   $temp = eregi_replace($pattern,"_",$temp);
   return $temp;
}
</pre>
<p>Jusque là tout va bien! Le problème est que parmis les caractères spéciaux il en est un qui est utilisé et qui pose plus problème que les autres c&#8217;est le &#8216; (lire &laquo;&nbsp;prime&nbsp;&raquo;). L&#8217;utilisation de ce caractère dans un nom de fichier à uploader fait que la variable $_FILES['Fichier']['tmp_name'] qui contient normalement le nom du fichier à uploader est vide &#8230;<br />
Il n&#8217;ya donc pas moyen d&#8217;utiliser la fonction antiSpecialChars() sus citée pour l&#8217;éliminer.<br />
Donc il faut agir avant le traitement du fichier, donc juste avant la soumission du formulaire, donc c&#8217;est avec JavaScript que ca va se passer.<br />
Il faut récupérer le nom du fichier</p>
<pre name="code" class="js:nogutter">
filename = document.getElementById('Fichier').value;
</pre>
<p>le traiter</p>
<pre name="code" class="js:nogutter">
tmp = filename.replace("'","_");
</pre>
<p>et réassigner avec un truc du genre</p>
<pre name="code" class="js:nogutter">
document.getElementById('Fichier').value = filename;
</pre>
<p>Mais ca évidemment ca ne marche pas. C&#8217;est du bon sens, puisque le formulaire ne serait plus capable de localiser le fichier à uploader, puiqu&#8217;il n&#8217;aurait plus le bon nom!!<br />
Bref, la feinte que j&#8217;ai trouvé est de passer par une variable cachée</p>
<pre name="code" class="html:nogutter">
&lt;input type="hidden" id="FichierNom" name="FichierNom" value="" /&gt;
</pre>
<p>qui me permettra de stocker le nom du fichier sans le &#8216; et je pourrais ainsi m&#8217;en servir pour la copie physique du fichier sur le serveur, à la place de $_FILES['Fichier']['tmp_name']  qui elle est toujours vide!<br />
Le problème est que dans tp je n&#8217;ai pas le nom du fichier mais sont path entier, donc je récapitule tout dans une fonction, qu&#8217;il n&#8217;y a qu&#8217;à mettre sur un évènement JavaScript du genre le onSubmit du formulaire &#8230;</p>
<pre name="code" class="js:nogutter">
function checkChars()
{
   filename = document.getElementById('Fichier').value;
   tmp = filename.replace("'","_");
   tmp2 = tmp.split("\\");
   tmp = tmp2.pop();
   document.getElementById('FichierNom').value = tmp;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.mazenod.fr/2007/01/le-caractere-dans-les-noms-de-fichiers-pour-un-formulaire-d-upload/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
