<?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>Blogouille &#187; Web</title>
	<atom:link href="http://blog.bafouille.fr/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.bafouille.fr</link>
	<description>Le blog de la bafouille</description>
	<lastBuildDate>Fri, 03 Feb 2012 23:25:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Now Reading Reloaded 5.1.3.3 &#8211; Version internationalisable intégrale &#8211; Version française &#8211; Correction de bug</title>
		<link>http://blog.bafouille.fr/web/now-reading-reloaded-5-1-3-3-version-francaise-integrale/</link>
		<comments>http://blog.bafouille.fr/web/now-reading-reloaded-5-1-3-3-version-francaise-integrale/#comments</comments>
		<pubDate>Sat, 04 Jun 2011 15:05:44 +0000</pubDate>
		<dc:creator>Bafouille</dc:creator>
				<category><![CDATA[Livres]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[bilbiothèque]]></category>
		<category><![CDATA[livres]]></category>
		<category><![CDATA[now reading reloaded]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[version française intégrale]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.bafouille.fr/?p=1076</guid>
		<description><![CDATA[Comme quelques autres amateurs de livres, j&#8217;avais joyeusement installé le plugin now reading reloaded, lui-même repris sur le plugin initial now reading. Hélas, la version française était loin d&#8217;être parfaite et, dans les dernières versions de wordpress, un bug affectait le titre de la page. Le plugin m&#8217;intéressait car il permet d&#8217;afficher sur le blog [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1080" title="Now Reading Reloaded - Plugin WordPress pour bibliothèque de livres" src="http://blog.bafouille.fr/wp-content/uploads/2011/06/nrr.jpg" alt="" width="530" height="100" /></p>
<p>Comme quelques autres amateurs de livres, j&#8217;avais joyeusement installé le plugin<a href="http://wordpress.org/extend/plugins/now-reading-reloaded/" target="_blank"> now reading reloaded</a>, lui-même repris sur le plugin initial <a href="http://robm.me.uk/projects/plugins/wordpress/now-reading" target="_blank">now reading</a>. Hélas, la version française était loin d&#8217;être parfaite et, dans les dernières versions de wordpress, un bug affectait le titre de la page.</p>
<p>Le plugin m&#8217;intéressait car il permet d&#8217;afficher sur le blog les livres que l&#8217;on lit, y compris ceux qu&#8217;on a lu et à venir. En somme, votre <a title="Ouvrir la bibliothèque de mon blog" href="http://blog.bafouille.fr/index.php?now_reading_library=true" target="_blank">bibliothèque se retrouve en ligne</a> et le plugin donne même des statistiques !</p>
<p><span id="more-1076"></span></p>
<p>Hélas, l&#8217;auteur <a href="http://heliologue.com/projects/now-reading-reloaded/" target="_blank">a arrêté le développement du plugin</a> à la version 5.1.3.2. Damned ! Plus qu&#8217;à mettre le nez dans le code pour finir de l&#8217;internationaliser, compléter le fichier de traduction pour la version française et corriger le dernier bug grâce aux bons conseils de <a href="http://www.brelson.com/2011/05/how-to-make-page-titles-work-properly-in-now-reading-reloaded/" target="_blank">Brendan Nelson</a>.</p>
<p>J&#8217;ai également ajouté un support pour les différentes tailles d&#8217;images de couverture fournies par Amazon. Il est ainsi possible d&#8217;afficher toutes les tailles disponibles en appelant la fonction book_image avec en premier paramètre &#8216;small&#8217;, &#8216;medium&#8217; ou &#8216;large&#8217;. Il est facultatif et s&#8217;il n&#8217;est pas mentionné, c&#8217;est la taille définie par défaut dans les options qui est utilisée.</p>
<p>Voici donc <a title="Télécharger le plugin Now Reading Reloaded 5.1.3.3" href="http://blog.bafouille.fr/wp-content/uploads/2011/06/now-reading-reloaded-5.1.3.3.zip" target="_blank">une version 5.1.3.3</a> qui ravira les francophones, du moins je l&#8217;espère. Pour les autres fichiers de langage, ils sont facilement actualisables avec poedit.</p>
<p>Pour obtenir un rendu différent, il est très facile de surcharger les templates comme indiqué dans le fichier readme. J&#8217;ai aussi ajouté une feuille de style pour personnaliser plus facilement la bibliothèque en fonction du thème.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.bafouille.fr%2Fweb%2Fnow-reading-reloaded-5-1-3-3-version-francaise-integrale%2F&amp;title=Now%20Reading%20Reloaded%205.1.3.3%20%26%238211%3B%20Version%20internationalisable%20int%C3%A9grale%20%26%238211%3B%20Version%20fran%C3%A7aise%20%26%238211%3B%20Correction%20de%20bug" id="wpa2a_2"><img src="http://blog.bafouille.fr/social.gif" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bafouille.fr/web/now-reading-reloaded-5-1-3-3-version-francaise-integrale/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eviter que le navigateur ne pré-remplisse des champs input de formulaire</title>
		<link>http://blog.bafouille.fr/web/eviter-que-le-navigateur-ne-pre-remplisse-des-champs-input-de-formulaire-autocompleteoff/</link>
		<comments>http://blog.bafouille.fr/web/eviter-que-le-navigateur-ne-pre-remplisse-des-champs-input-de-formulaire-autocompleteoff/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 22:42:28 +0000</pubDate>
		<dc:creator>Bafouille</dc:creator>
				<category><![CDATA[Html et Xhtml]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[autocomplete]]></category>
		<category><![CDATA[formulaire]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[navigateur]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://blog.bafouille.fr/?p=634</guid>
		<description><![CDATA[Petite astuce souvent méconnue, un attribut très pratique a été introduit dans la plupart des navigateurs modernes : la possibilité de rajouter autocomplete="off" à un élément input. Quel intérêt ? Eviter que le navigateur ne propose automatiquement des valeurs pour cet élément. Exemple : formulaire d&#8217;identification et création d&#8217;utilisateur (code volontairement simplifié) ?View Code HTML1 [...]]]></description>
			<content:encoded><![CDATA[<div><img class="aligncenter size-full wp-image-652" style="border: 0px initial initial;" title="autocomplete=off dans un camp input" src="http://blog.bafouille.fr/wp-content/uploads/2010/03/autocomplete.jpg" alt="" width="530" height="107" /></div>
<p>Petite astuce souvent méconnue, un attribut très pratique a été introduit dans la plupart des navigateurs modernes : la possibilité de rajouter <code>autocomplete="off"</code> à un élément <code>input</code>. Quel intérêt ? Eviter que le navigateur ne propose automatiquement des valeurs pour cet élément.<br />
<span id="more-634"></span></p>
<h4>Exemple : formulaire d&#8217;identification et création d&#8217;utilisateur (code volontairement simplifié)</h4>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p634code3'); return false;">View Code</a> HTML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6343"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code" id="p634code3"><pre class="html" style="font-family:monospace;">Page : index.html
------------------------------------------------
[...]
&lt;form&gt;
&lt;input name=&quot;identifiant&quot; /&gt;
&lt;input name=&quot;motpasse&quot; type=&quot;password&quot; /&gt;
&lt;input type=&quot;submit&quot; /&gt;
&lt;/form&gt;
&nbsp;
[...]
&nbsp;
Page : new_user.html
-------------------------------------------------
[...]
&lt;form action=&quot;create_user.html&quot;&gt;
   Nom de l'utilisateur :
&lt;input name=&quot;identifiant&quot; /&gt;
   Mot de passe :
&lt;input name=&quot;motpasse&quot; /&gt;
&lt;/form&gt;
&nbsp;
[...]</pre></td></tr></table></div>

<p>Que se passera-t-il dans cet exemple si l&#8217;administrateur a choisi d&#8217;enregistrer ses informations d&#8217;identification ? Elles seront automatiquement reprises dans le formulaire de création d&#8217;un nouvel utilisateur. Une solution simple serait de nommer différemment les champs sur la seconde page mais il est tout aussi simple de spécifier au navigateur que l&#8217;on ne souhaite pas reprendre les informations en rajoutant <code>autocomplete="off"</code> en attribut dans les champs <code>input</code> :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p634code4'); return false;">View Code</a> HTML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6344"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p634code4"><pre class="html" style="font-family:monospace;">[...]
&lt;form action=&quot;create_user.html&quot;&gt;
   Nom de l'utilisateur :
&lt;input name=&quot;identifiant&quot; /&gt;
   Mot de passe :
&lt;input name=&quot;motpasse&quot; /&gt;
&lt;/form&gt;
&nbsp;
[...]</pre></td></tr></table></div>

<p>C&#8217;est par exemple très pratique pour éviter de devoir retravailler des données avec cakephp et garder les fonctionnalités <em>&laquo;&nbsp;automagic&nbsp;&raquo;</em>.</p>
<p>Prenons un autre exemple : vous souhaitez utiliser Ajax pour proposer des réponses en fonction de la saisie dans un champ <code>input</code>. Une autre fonctionnalité des navigateurs modernes est de proposer automatiquement des suggestions en fonction d&#8217;anciennes saisies dans une liste déroulante. Problème avec votre fonctionnalité Ajax qui peut alors entrer en conflit. Là encore, la propriété <code>autocomplete</code> vous permet un meilleur contrôle de l&#8217;interface utilisateur.</p>
<h4>Le validateur W3C signale une anomalie !</h4>
<p>Dans la version 4.01 d&#8217;HTML et 1.0 d&#8217;XHTML, la propriété <code>autocomplete</code> n&#8217;est pas dans les spécifications du W3C. En revanche, le W3C le prévoit dans <a href="http://www.w3.org/TR/xhtml2/mod-xforms.html#s_xformsmodule_issue_1" target="_blank">XHTML 2</a> et <a href="http://www.w3.org/TR/2009/WD-html5-20090825/forms.html#the-autocomplete-attribute" target="_blank">HTML 5</a> (du moins la question est posée). Dans l&#8217;intervalle, les navigateurs modernes ont déjà pris le train en marche car cet attribut est notamment utilisé par des sites demandant des numéros de carte de crédit.</p>
<p>La fondation Mozilla a <a href="https://wiki.mozilla.org/The_autocomplete_attribute_and_web_documents_using_XHTML" target="_blank">alerté à de nombreuses reprises</a> sur les risques de sécurité à utiliser un tel attribut par rapport à l&#8217;implémentation qui en avait été faite dans les navigateurs à l&#8217;époque mais la polémique s&#8217;est quasiment éteinte depuis la sortie des versions postérieures à 2008.</p>
<p>Toutefois, le validateur du W3C continue de signaler une erreur car <code>autocomplete</code> reste un attribut non standard. Pour passer outre malgré tout, il suffit d&#8217;attribuer la propriété par javascript après le chargement de la page ou d&#8217;émuler complètement la fonctionnalité. Ce n&#8217;est pas élégant mais c&#8217;est le seul moyen à l&#8217;heure actuelle d&#8217;avoir l&#8217;<em>imprimatur</em> du W3C.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.bafouille.fr%2Fweb%2Feviter-que-le-navigateur-ne-pre-remplisse-des-champs-input-de-formulaire-autocompleteoff%2F&amp;title=Eviter%20que%20le%20navigateur%20ne%20pr%C3%A9-remplisse%20des%20champs%20input%20de%20formulaire" id="wpa2a_4"><img src="http://blog.bafouille.fr/social.gif" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bafouille.fr/web/eviter-que-le-navigateur-ne-pre-remplisse-des-champs-input-de-formulaire-autocompleteoff/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problème d&#8217;authentification SMTP avec le composant email de CakePHP</title>
		<link>http://blog.bafouille.fr/web/probleme-dauthentification-smtp-avec-le-composant-email-de-cakephp/</link>
		<comments>http://blog.bafouille.fr/web/probleme-dauthentification-smtp-avec-le-composant-email-de-cakephp/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 19:58:17 +0000</pubDate>
		<dc:creator>Bafouille</dc:creator>
				<category><![CDATA[Cakephp]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[ehlo]]></category>
		<category><![CDATA[helo]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[smtp]]></category>

		<guid isPermaLink="false">http://blog.bafouille.fr/?p=498</guid>
		<description><![CDATA[La version 1.2x de CakePhp possède un composant très pratique pour envoyer des courriels et permet d&#8217;éviter le recours à des solutions externes comme phpmailer ou swiftmailer (même s&#8217;ils sont incontournables dans la version 1.1x et des tutos sont disponibles dans la cuisine de cakephp). Les mises à jour sont régulières et il est préférable [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-499" title="Mail flow" src="http://blog.bafouille.fr/wp-content/uploads/2009/10/smtp-flow.png" alt="Mail flow" width="560" height="93" />La version 1.2x de CakePhp possède un composant très pratique pour envoyer des courriels et permet d&#8217;éviter le recours à des solutions externes comme phpmailer ou swiftmailer (même s&#8217;ils sont incontournables dans la version 1.1x et des tutos sont disponibles dans la<a title="http://bakery.cakephp.org" href="http://bakery.cakephp.org" target="_blank"> cuisine de cakephp</a>).</p>
<p>Les mises à jour sont régulières et il est préférable de les installer car ce composant est souvent actualisé.</p>
<p>Toutefois, j&#8217;ai buté dans un os et, comme je suis partageur, je me dis qu&#8217;il vaut mieux le ronger à plusieurs (j&#8217;ai soumis un ticket à ce sujet sur cakephp d&#8217;ailleurs).<br />
<span id="more-498"></span></p>
<h2>Envoyer un courriel avec le composant email</h2>
<p>Le manuel est très bien fait et laisse peu de place au hasard. La création du message peut se faire directement dans le contrôleur (hum côté MCV, ça se pose un peu là) ou via des layouts et des vues (c&#8217;est mieux).</p>
<p>Le composant permet 2 méthodes d&#8217;envoi :</p>
<ul>
<li>La fonction mail de PHP : Elle est relativement limitée et, si elle n&#8217;est pas implémentée sur le serveur, ne fonctionne pas.</li>
<li>L&#8217;utilisation du protocole SMTP (<code>sending mail protocol</code>) : C&#8217;est ce protocole qui est généralement utilisé par les clients de messagerie habituels. Son utilisation ne nécessite pas toujours de s&#8217;authentifier mais la plupart des fournisseurs d&#8217;accès internet (FAI) l&#8217;impose pour éviter des utilisations frauduleuses de leurs serveurs.</li>
</ul>
<p>Pour envoyer un mail via SMTP, il vous faut habituellement 3 informations : l&#8217;adresse du serveur, un nom d&#8217;utilisateur et un mot de passe, accessoirement un numéro de port (25 par défaut) . Vous les avez ? Parfait. Passons à la suite.</p>
<p>La configuration du composant est des plus simples et <a title="Page du manuel de CakePHP sur le composant Email" href="http://book.cakephp.org/view/176/Email" target="_blank">documentée dans le manuel de cakephp</a>. Je ne reviendrais donc pas là-dessus.</p>
<h2>Mes courriels ne partent pas !</h2>
<p>Après avoir suivi scrupuleusement les instructions et renseigné correctement le tableau smtpOptions, vous essayez fièrement votre script et&#8230; une erreur 550, le mail n&#8217;est pas parti !</p>
<p>Cet incapable de serveur SMTP vous explique que le message ne peut pas être relayé depuis &lt;votre nom de domaine ou IP&gt; ou quelque chose dans ce goût là ! Fiévreusement, vous vérifiez toutes vos informations, elles sont correctes !</p>
<p>Mais que s&#8217;est-il donc passé ?</p>
<p>Pour le savoir, utilisons telnet (accessible par l&#8217;invite de commande sous Windows, tapez menu démarrer -&gt; exécuter -&gt;cmd et ok, par la console sous Linux). Pourquoi ? Telnet va nous permettre de simuler étape par étape une transaction SMTP pour voir où réside le problème.</p>
<p><strong>Première étape, se connecter au serveur SMTP</strong>. Entrez la commande : <code>telnet &lt;votre_serveur_smtp&gt; XX</code> où XX est le numéro du port (généralement 25 mais pas forcément).<br />
Normalement votre serveur devrait vous répondre quelque chose du genre : <code>220 - </code>. Peut importe le texte, pourvu que le code soit 220. Cela veut dire que le serveur attend vos commandes.</p>
<p><strong>Deuxième étape, dire bonjour</strong>. Entrez <code>HELO</code>. Le serveur va vous répondre quelque chose qui doit commencer par le code 250. Si ce n&#8217;est pas ce code, il est fort possible que le serveur n&#8217;accepte pas d&#8217;entrer en discussion avec un client non reconnu.</p>
<p><strong>Troisième étape, demandez à s&#8217;identifier</strong>. Tapez <code>AUTH LOGIN</code>.  Si le serveur vous renvoie un code 503, c&#8217;est que vous n&#8217;avez pas à vous identifier. S&#8217;il s&#8217;agit d&#8217;un code 334, il attend un identifiant et un mot de passe.</p>
<p>C&#8217;est cette procédure que suit le composant email de CakePhp (et c&#8217;est normal). Lorsqu&#8217;il reçoit une réponse 503, il n&#8217;envoie pas de nom d&#8217;utilisateur ni de mot de passe considérant que c&#8217;est inutile. <strong>Tout va bien quand ça l&#8217;est vraiment</strong>.</p>
<p>Mon hébergeur, mavenhosting (très bien au demeurant), m&#8217;a réservé une petite surprise sur laquelle j&#8217;ai passée quelques heures. Le serveur SMTP renvoyait un code 503 à mon <code>AUTH LOGIN</code> mais refusait d&#8217;envoyer des e-mails sans authentification et tout finissait en une belle erreur 550.</p>
<p>En fouillant un peu sur le net, je me suis aperçu que le standard <code>HELO</code> était devenu <code>EHLO</code> (extended <code>HELO</code>). Pour autant, tous les serveurs devraient pouvoir encore gérer <code>HELO</code>. <strong><a href="http://www.exim.org/lurker/message/20040902.003002.43123677.fr.html" target="_blank">Et bien pas Exim dans les versions supérieurs à la 4.2</a>.</strong></p>
<p>En utilisant <code>EHLO</code>, puis <code>AUTH LOGIN</code>, le serveur m&#8217;a renvoyé un code 334 pour me demander de m&#8217;authentifier. Il m&#8217;a donc suffit de modifier légèrement <code>mailer.php</code> à la ligne 693 comme ceci :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p498code6'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4986"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p498code6"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__smtpSend<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;EHLO <span style="color: #006699; font-weight: bold;">{$host}</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'250'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">smtpSend</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;HELO <span style="color: #006699; font-weight: bold;">{$host}</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'250'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>La commande <code>HELO</code> ne sera utilisée que si <code>EHLO</code> ne fonctionne pas. Je ne sais s&#8217;il est souhaitable de faire ainsi et je laisse le soin aux excellents développeurs (bénévoles qui plus est) de cakePHP de trancher. En attendant, ça semble fonctionner.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.bafouille.fr%2Fweb%2Fprobleme-dauthentification-smtp-avec-le-composant-email-de-cakephp%2F&amp;title=Probl%C3%A8me%20d%26%238217%3Bauthentification%20SMTP%20avec%20le%20composant%20email%20de%20CakePHP" id="wpa2a_6"><img src="http://blog.bafouille.fr/social.gif" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bafouille.fr/web/probleme-dauthentification-smtp-avec-le-composant-email-de-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bien configurer un routeur externe et une freebox</title>
		<link>http://blog.bafouille.fr/web/bien-configurer-un-routeur-externe-et-une-freebox/</link>
		<comments>http://blog.bafouille.fr/web/bien-configurer-un-routeur-externe-et-une-freebox/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 13:28:52 +0000</pubDate>
		<dc:creator>Bafouille</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[freebox]]></category>
		<category><![CDATA[Installation]]></category>
		<category><![CDATA[lan]]></category>
		<category><![CDATA[routeur]]></category>
		<category><![CDATA[wan]]></category>

		<guid isPermaLink="false">http://blog.bafouille.fr/?p=455</guid>
		<description><![CDATA[La freebox fournit par défaut des fonctionnalités de routeur et wi-fi mais il y a des cas où celles-ci ne répondent pas aux besoins (wi-fi N, plusieurs PC en éthernet&#8230;) et où un simple switch ne suffit pas. Sous peine de crouler sous les conflits d&#8217;IP ou des pertes de connexion aléatoires ou intermittentes, il [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-456" title="Bien configurer une freebox et un routeur externe" src="http://blog.bafouille.fr/wp-content/uploads/2009/09/freebox-et-routeur.jpg" alt="Bien configurer une freebox et un routeur externe" width="560" height="90" /></p>
<p>La freebox fournit par défaut des fonctionnalités de routeur et wi-fi mais il y a des cas où celles-ci ne répondent pas aux besoins (wi-fi N, plusieurs PC en éthernet&#8230;) et où un simple switch ne suffit pas. Sous peine de crouler sous les conflits d&#8217;IP ou des pertes de connexion aléatoires ou intermittentes, il y a certaines précautions de configuration à respecter pour associer un routeur à une freebox.<br />
<span id="more-455"></span></p>
<h2>Configuration de la freebox</h2>
<div id="attachment_457" class="wp-caption alignleft" style="width: 160px"><a href="http://blog.bafouille.fr/wp-content/uploads/2009/09/console-freebox.gif" rel="lightbox[455]"><img class="size-thumbnail wp-image-457" title="Console de configuration des fonctionnalités routeur et DHCP de la freebox" src="http://blog.bafouille.fr/wp-content/uploads/2009/09/console-freebox-150x150.gif" alt="Console de configuration des fonctionnalités routeur et DHCP de la freebox" width="150" height="150" /></a><p class="wp-caption-text">Console de configuration des fonctionnalités routeur et DHCP de la freebox</p></div>
<p>Pour cela branchez la freebox directement sur votre PC par le câble Ethernet.</p>
<p>Les fonctionnalités de la freebox se configurent à partir de la console de gestion du compte, onglet internet, accessible en s&#8217;identifiant sur <a title="Accéder à console de gestion de votre compte dree" href="http://subscribe.free.fr/login/" target="_blank">http://subscribe.free.fr/login/</a></p>
<p>En cochant la case &laquo;&nbsp;activer le service&nbsp;&raquo;, vous activez la fonction routeur de la freebox. Vous pouvez également activer la fonctionnalité de serveur DHCP.</p>
<p>Si vous n&#8217;activez pas la fonctionnalité routeur de la freebox, la configuration sera différente selon que vous êtes en zone dégroupée ou non. A moins que vous n&#8217;ayez des problèmes de connexion, je vous recommande de l&#8217;activer (il vous faudra certainement redémarrer la freebox). Laissez l&#8217;IP par défaut pour la freebox soit 192.168.0.254</p>
<h2>Configuration du routeur (freebox avec service routeur activé)</h2>
<p>Débranchez la freebox et connectez votre PC au routeur (par câble Ethernet de préférence), mais ne branchez pas la freebox tout de suite sur le port WAN. Allez dans la console de gestion de votre routeur (généralement en entrant 192.168.0.1 ou 192.168.1.1 dans le navigateur internet).</p>
<p><strong><span style="color: #993300;">Important : Votre réseau local doit donc utiliser une classe de réseau différente s&#8217;il est sur 192.168.0.xxx, passez le sur 192.168.1.xxx. Pour cela, commencez par attribuer l&#8217;IP 192.168.1.1 à votre routeur le cas échéant et reconfigurez éventuellement le serveur DHCP (normalement, ce n&#8217;est pas la peine).Redémarrez le routeur si besoin (notamment si votre PC ne se connecte plus du tout au routeur) et retournez dans la console de gestion. Si vous laissez votre routeur sur la même classe de réseau, il se comportera comme un simple switch (ou votre réseau fera des siennes, c&#8217;est selon).<br />
</span></strong></p>
<h4>Configuration internet du routeur</h4>
<ul>
<li>Type de connexion : DHCP (si serveur DHCP activé sur Freebox)  ou Static IP (si serveur DHCP désactivé sur Freebox)</li>
</ul>
<p>Pour une configuration en IP statique :</p>
<ul>
<li>Adresse IP : <strong>192.168.0.1</strong> (IP sur le LAN du routeur Freebox)</li>
<li> Masque : 255.255.255.0</li>
<li> Passerelle : <strong>192.168.0.254</strong><span class="hl1"> (</span><span class="hl1">c&#8217;est l&#8217;IP</span><span class="hl1"> de la freebox telle qu&#8217;indiquée dans sa console de gestion, voir plus haut)<br />
</span></li>
<li> DNS primaire et secondaire  : voir plus bas</li>
</ul>
<h4>Configuration du LAN</h4>
<ul>
<li>IP du routeur : 192.168.1.1</li>
<li>Masque : 255.255.255.0</li>
<li>IP des postes : DHCP ou IP statiques selon la configuration de votre serveur DHCP (192.168.1.xxx)</li>
<li>Passerelle : 192.168.1.1 (IP du routeur)</li>
<li>DNS : 192.168.1.1 (IP du routeur)</li>
</ul>
<p>Il ne vous reste plus qu&#8217;à connecter la freebox au port WAN de votre routeur.</p>
<p><strong><em>Conseil : Si vous avez de vieux postes en Windows 98 dans votre réseau, il est préférable de les mettre en IP statiques sinon il peut y avoir des problèmes de visibilité du poste sur le réseau.</em></strong></p>
<p>Si vous voulez utiliser la redirection de ports, il vous suffit de mettre la freebox en DMZ<em> (</em>zone démilitarisée) par son adresse 192.168.0.1</p>
<h2>Configuration du routeur (mode routage de la freebox désactivé)</h2>
<p>Normalement, la configuration avec la freebox en routeur devrait fonctionner. Dans le cas contraire, ou  si vous ne souhaitez pas l&#8217;activer, voici les configurations du routeur et des postes.</p>
<h4>En zone dégroupée (IP fixe)</h4>
<p>Si le serveur DHCP est désactivé, il vous faut récupérer votre IP attribuée par Free ainsi que celle de la passerelle. Pour cela, le plus simple est brancher directement un PC sur la freebox et dans l&#8217;onglet &laquo;&nbsp;support&nbsp;&raquo; de votre état de connexion vous aurez les infos.</p>
<ul>
<li><strong>Paramètres Internet du routeur</strong></li>
<p>Type de connexion : Automatic Configuration &#8211; DHCP<br />
ou<br />
Type de connexion : Static IP<br />
Adresse IP : <strong>IP donnée par Free</strong><br />
Masque : 255.255.255.0<br />
Passerelle : <strong>Passerelle donnée par Free</strong><br />
DNS 1 : (voir la liste des DNS de Free)<br />
DNS 2 : (voir la liste des DNS de Free)</p>
<li><strong>Paramètres Réseau du routeur</strong></li>
<p>Adresse IP : <strong>192.168.1.1</strong><br />
Masque : 255.255.255.0</p>
<li><strong>Paramètres Réseau des PC</strong></li>
<p>Adresse IP : 192.168.1.xxx (si serveur DHCP désactivé sur routeur)<br />
Masque : 255.255.255.0<br />
Passerelle : <strong>192.168.1.1</strong><br />
DNS : <strong>192.168.1.1</strong></ul>
<h4><span class="hl3">En</span><span class="hl3"> zone non dégroupée</span></h4>
<ul>
<li><strong>Paramètres Internet du routeur</strong></li>
<p>Type de connexion : PPPoE<br />
Identifiant : xxxxxxxxxx@freeadsl (numéro de téléphone)<br />
Mot de passe : xxxxxxxxxx (celui de la console d&#8217;administration Freebox)</p>
<li><strong>Paramètres Réseau du routeur</strong></li>
<p>Adresse IP : <strong>192.168.1.1</strong><br />
Masque : 255.255.255.0</p>
<li><strong>Paramètres Réseau des PC</strong></li>
<p>Adresse IP : 192.168.1.xxx (si serveur DHCP désactivé sur routeur)<br />
Masque : 255.255.255.0<br />
Passerelle : <strong>192.168.1.1</strong><br />
DNS : <strong>192.168.1.1</strong></ul>
<h2>Informations pratiques</h2>
<h4><span class="hl3">Liste des IP des serveurs DNS de Free</span></h4>
<ul>
<li>212.27.40.240</li>
<li>212.27.40.241</li>
</ul>
<p><a title="Partage de fichiers sous Windows XP" href="http://www.commentcamarche.net/contents/configuration-reseau/partage-fichiers.php3" target="_blank"><img class="alignnone size-full wp-image-401" title="Lien externe (s'ouvrira dans une nouvelle fenêtre/onglet)" src="http://blog.bafouille.fr/wp-content/uploads/2009/09/external.png" alt="Lien externe (s'ouvrira dans une nouvelle fenêtre/onglet)" width="10" height="10" /></a> <a title="Configurer la freebox en mode routeur" href="http://www.journaldufreenaute.fr/05/03/2008/tuto-le-routeur-de-la-freebox-explications-et-configuration.html" target="_blank">http://www.journaldufreenaute.fr/05/03/2008/tuto-le-routeur-de-la-freebox-explications-et-configuration.html</a></p>
<h4>Partage de fichiers sous windows dans le réseau local</h4>
<div id="attachment_465" class="wp-caption alignright" style="width: 269px"><a href="http://blog.bafouille.fr/wp-content/uploads/2009/09/netbios.gif" rel="lightbox[455]"><img class="size-medium wp-image-465" title="Protocole netBIOS NWLink" src="http://blog.bafouille.fr/wp-content/uploads/2009/09/netbios-259x300.gif" alt="Protocoles utilisés par la connexion" width="259" height="300" /></a><p class="wp-caption-text">Protocoles utilisés par la connexion</p></div>
<p>Pour ceux qui voudraient partager des fichiers ou des imprimantes par le réseau local, le protocole NetBIOS doit être chargé sur chacun des postes (et pour chacune des cartes réseau utilisées le cas échéant).</p>
<p>C&#8217;est un piège courant quand on configure un réseau local car il ne sont généralement pas installés par défaut.</p>
<p>Cliquez sur installer, protocole, NetBIOS NWLink. Le protocole de transport compatible IPX s&#8217;installera en même temps automatiquement. Il est utile pour les parties en réseau local pour de vieux jeux.</p>
<p><strong>Pour plus de renseignements sur le partage de fichiers :</strong></p>
<p><a title="Partage de fichiers sous Windows XP" href="http://www.commentcamarche.net/contents/configuration-reseau/partage-fichiers.php3" target="_blank"><img class="alignnone size-full wp-image-401" title="Lien externe (s'ouvrira dans une nouvelle fenêtre/onglet)" src="http://blog.bafouille.fr/wp-content/uploads/2009/09/external.png" alt="Lien externe (s'ouvrira dans une nouvelle fenêtre/onglet)" width="10" height="10" /> http://www.commentcamarche.net/contents/configuration-reseau/partage-fichiers.php3</a></p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 623px; width: 1px; height: 1px;">
<ul>
<li><strong>Paramètres Internet du routeur</strong></li>
<p>Type de connexion : Automatic Configuration &#8211; DHCP (si serveur DHCP activé sur Freebox)<br />
ou<br />
Type de connexion : Static IP (si serveur DHCP désactivé sur Freebox)<br />
Adresse IP : <strong>192.168.0.1</strong><br />
Masque : 255.255.255.0<br />
Passerelle : <strong>192.168.0.254</strong><br />
DNS 1 : (voir la liste des DNS de Free)<br />
DNS 2 : (voir la liste des DNS de Free)</p>
<li><strong>Paramètres Réseau du routeur</strong></li>
<p>Adresse IP : <strong>192.168.1.1</strong><br />
Masque : 255.255.255.0</p>
<li><strong>Paramètres Réseau des PC</strong></li>
<p>Adresse IP : 192.168.1.xxx (si serveur DHCP désactivé sur routeur)<br />
Masque : 255.255.255.0<br />
Passerelle : <strong>192.168.1.1</strong><br />
DNS : <strong>192.168.1.1</strong></ul>
</div>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.bafouille.fr%2Fweb%2Fbien-configurer-un-routeur-externe-et-une-freebox%2F&amp;title=Bien%20configurer%20un%20routeur%20externe%20et%20une%20freebox" id="wpa2a_8"><img src="http://blog.bafouille.fr/social.gif" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bafouille.fr/web/bien-configurer-un-routeur-externe-et-une-freebox/feed/</wfw:commentRss>
		<slash:comments>49</slash:comments>
		</item>
		<item>
		<title>Utilisation de Flash pour suivre le chargement (upload) d&#8217;un fichier avec Ajax et PHP</title>
		<link>http://blog.bafouille.fr/web/utilisation-de-flash-pour-suivre-le-chargement-upload-dun-fichier-avec-ajax-et-php/</link>
		<comments>http://blog.bafouille.fr/web/utilisation-de-flash-pour-suivre-le-chargement-upload-dun-fichier-avec-ajax-et-php/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 21:09:07 +0000</pubDate>
		<dc:creator>Bafouille</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[applet]]></category>
		<category><![CDATA[chargement]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://blog.bafouille.fr/?p=148</guid>
		<description><![CDATA[Étant donné qu&#8217;il n&#8217;est pas possible d&#8217;installer l&#8217;extension APC sur certaines configurations serveur (hébergement dédié ou gratuit par exemple), la seule possibilité pour afficher la progression du chargement reste dans ce cas là de recourir à un applet (flash, java&#8230;). L&#8217;inconvénient d&#8217;un applet est qu&#8217;il nécessite des connaissances en java ou actionscript pour flash (en [...]]]></description>
			<content:encoded><![CDATA[<p>Étant donné qu&#8217;il n&#8217;est pas possible d&#8217;installer l&#8217;<a title="Article de ce blog sur l'utilisation d'APC pour suivre le chargement d'un fichier" href="http://blog.bafouille.fr/?cat=9">extension APC</a> sur certaines configurations serveur (hébergement dédié ou gratuit par exemple), la seule possibilité pour afficher la progression du chargement reste dans ce cas là de recourir à un applet (flash, java&#8230;).</p>
<p>L&#8217;inconvénient d&#8217;un applet est qu&#8217;il nécessite des connaissances en java ou actionscript pour flash (en plus du logiciel payant dans ce dernier cas).</p>
<p>Toutefois, il existe plusieurs solutions gratuites qui permettent des upload multiples en flash :</p>
<ul>
<li>Nas Uploader (<a title="Page d'accueil du site de Nas Uploader" href="http://www.nasuploader.com">http://www.nasuploader.com</a>) : C&#8217;est certainement le plus simple mais aussi le moins souple côté configuration. Du coup, il est très bien adapté pour celui qui veut une solution simple et rapide.</li>
<li>SWF Upload (<a title="Page d'accueil du site de SWF Upload" href="http://swfupload.org">http://swfupload.org</a>) : C&#8217;est peut-être le plus connu. Il est entièrement paramétrable ce qui le rend également difficile à prendre en main.</li>
<li>Fancy Upload (<a title="Page d'accueil du site de Fancy Upload" href="http://digitarald.de/project/fancyupload">http://digitarald.de/project/fancyupload</a>) : Le plus esthétique à mon sens. Son seul &laquo;&nbsp;défaut&nbsp;&raquo; est de s&#8217;appuyer sur le framework javascript Mootools pour fonctionner ce qui peut poser des problèmes si vous en utilisez un autre (par exemple prototype <img src='http://blog.bafouille.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </li>
</ul>
<p>Côté serveur, le script PHP n&#8217;a rien de révolutionnaire puisque le traitement du fichier chargé reste identique.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.bafouille.fr%2Fweb%2Futilisation-de-flash-pour-suivre-le-chargement-upload-dun-fichier-avec-ajax-et-php%2F&amp;title=Utilisation%20de%20Flash%20pour%20suivre%20le%20chargement%20%28upload%29%20d%26%238217%3Bun%20fichier%20avec%20Ajax%20et%20PHP" id="wpa2a_10"><img src="http://blog.bafouille.fr/social.gif" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bafouille.fr/web/utilisation-de-flash-pour-suivre-le-chargement-upload-dun-fichier-avec-ajax-et-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Connaître la progression d&#8217;un chargement (upload) de fichier en PHP</title>
		<link>http://blog.bafouille.fr/web/ajax-web/connaitre-la-progression-dun-chargement-upload-de-fichier-en-php/</link>
		<comments>http://blog.bafouille.fr/web/ajax-web/connaitre-la-progression-dun-chargement-upload-de-fichier-en-php/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 23:11:55 +0000</pubDate>
		<dc:creator>Bafouille</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[fichiers]]></category>
		<category><![CDATA[formulaire]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://blog.bafouille.fr/?p=37</guid>
		<description><![CDATA[Lorsque l&#8217;on conçoit un formulaire permettant l&#8217;upload de fichier, il est souvent souhaité de pouvoir indiquer à l&#8217;utilisateur la progression du chargement que ce soit sous forme graphique ou texte.Seul hic, PHP ne permet pas dans sa version &#171;&#160;standard&#160;&#187; une telle approche. Lors du traitement d&#8217;un upload de fichier, la variable superglobale _FILES n&#8217;est renseignée [...]]]></description>
			<content:encoded><![CDATA[<p>Lorsque l&#8217;on conçoit un formulaire permettant l&#8217;upload de fichier, il est souvent souhaité de pouvoir indiquer à l&#8217;utilisateur la progression du chargement que ce soit sous forme graphique ou texte.Seul hic, PHP ne permet pas dans <a title="Gestion des téléchargements sur PHP.net" href="http://fr2.php.net/manual/fr/features.file-upload.post-method.php">sa version &laquo;&nbsp;standard&nbsp;&raquo;</a> une telle approche.  Lors du traitement d&#8217;un upload de fichier, la <a title="La variable _FILES" href="http://fr2.php.net/manual/fr/reserved.variables.files.php">variable superglobale <code>_FILES</code></a> n&#8217;est renseignée qu&#8217;une fois le fichier complètement chargé sur le serveur et au chaud dans le répertoire temporaire.  Impossible donc de l&#8217;utiliser pour accéder aux informations du fichier en cours de chargement, et notamment du nom qui lui a été affecté dans le répertoire temporaire.</p>
<h4>C&#8217;est très bien, mais ne peut-on rien y faire ?</h4>
<p>Plusieurs solutions sont possibles :</p>
<ul>
<li>Utiliser un autre language de <a title="Common Gateway Interface, ce sont des scripts qui traitent les données côté serveur et renvoient éventuellement quelque chose au client">CGI</a> pour récupérer et afficher les informations du téléchargement</li>
<li>Utiliser un applet java ou Flash (il y en a des très biens)</li>
<li>Utiliser PHP (et ajax bien sûr pour mettre à jour l&#8217;affichage)</li>
</ul>
<p>Oui, vous avez bien lu, on peut utiliser PHP. Pour les vieilles versions, il est nécessaires d&#8217;appliquer un patch à l&#8217;installation PHP, mais à partir de la version 5.2.0, le support pour le module <a title="Alternative PHP Cache">APC</a> est intégré dans la distribution. Pour les plus courageux, <a href="http://www.phpclasses.org/blog/post/61-File-upload-progress-meter-for-PHP-4-at-last.html">le suivi est possible en PHP4</a>, mais je trouve quand même plus simple de passer à PHP 5.2. Un italien a aussi décrit <a href="http://www.devpro.it/upload_progress/">une méthode sans installer APC</a>. L&#8217;inconvénient est qu&#8217;elle se base sur un suivi de l&#8217;apparition de fichiers temporaires ce qui la rend complètement inutilisable lorsque de nombreux fichiers sont créés quasi simultanément.</p>
<p>La suite du message décrit comment utiliser APC pour récupérer les informations sur le déroulement d&#8217;un upload.<br />
<span id="more-37"></span></p>
<h4>Installer APC</h4>
<p>APC est un package PECL qui n&#8217;est pas installé par défaut dans PHP. Vous trouverez  un guide d&#8217;installation sur <code><a href="http://fr.php.net/manual/fr/apc.installation.php">http://fr.php.net/manual/fr/apc.installation.php</a></code> Pour les utilisateurs de Windows qui ne pourraient pas compiler la bibliothèque, voici un <a href="http://kromann.info/download.php?strFolder=php5_2-Release_TS&amp;strIndex=PHP5_2">lien alternatif</a> pour trouver des modules compilés dans l&#8217;attente du retour de pecl4win.</p>
<h4>Configurer APC pour suivre l&#8217;upload de fichiers</h4>
<p>Par ailleurs, il faut encore activer l&#8217;option d&#8217;APC permettant de récupérer des informations sur le chargement en cours. Pour cela, il suffit de rajouter <code>apc.rfc1867 = on</code> dans le fichier <code>php.ini</code>. Il faut aussi charger l&#8217;extension dans le <code>php.ini</code> grâce à <code>extension="apc.so"</code> ou <code>extension=php_apc.dll</code> sous Windows</p>
<h4>Récupérer les informations sur le chargement en cours</h4>
<p>Une fois le module APC et son extension rfc1867 fonctionnels, il est possible de <a href="http://fr.php.net/manual/fr/apc.configuration.php#ini.apc.rfc1867">récupérer les information du chargement en cours</a>.  Vous trouverez de nombreux scripts sur la toile permettant d&#8217;exploiter cette fonctionnalité :</p>
<ul>
<li><a href="http://pecl.php.net/package/uploadprogress">Uploadprogressmeter</a> : un autre package PECL avec <a href="http://www.nata2.org/2007/04/16/pecl-uploadprogress-example/">un exemple</a>.</li>
<li><a href="http://sourceforge.net/projects/megaupload/">Megaupload</a> : Très complet, il peut aussi utiliser Perl et JSP.</li>
</ul>
<p>Si vous êtes un acharné du code, voici quelque explications basé sur l&#8217;utilisation d&#8217;un iframe (voir <a href="http://blog.bafouille.fr/?p=16">http://blog.bafouille.fr/?p=16</a> pour plus d&#8217;informations sur l&#8217;upload de fichier).  Il nous faut tout d&#8217;abord un formulaire avec un champ caché nommé <code>APC_UPLOAD_PROGRESS</code> et une id unique. Nous utiliserons pour cela la fonction PHP <code>uniqid()</code>. Comme il ne faut pas recharger la page suite à la soumission du formulaire, la cible de celui-ci sera un <code>IFRAME</code> caché. Enfin, il nous faut lancer en parallèle un javascript pour interroger le serveur et mettre à jour les informations de chargement.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p37code9'); return false;">View Code</a> HTML4STRICT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p379"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p37code9"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt; ?php $id_for_apc <span style="color: #66cc66;">=</span> uniqid<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; ?&gt;</span>;
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/form.html"><span style="color: #000000; font-weight: bold;">form</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;leForm&quot;</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;traitement.php&quot;</span> <span style="color: #000066;">enctype</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;multipart/form-data&quot;</span> <span style="color: #000066;">method</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;pcost&quot;</span> <span style="color: #000066;">onsubmit</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;pollProgress(&lt;?php echo $id_for_apc ?&gt;</span></span>)&quot;&gt;
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">input</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?php echo $id_for_apc ?/&gt;</span></span>&quot; name=&quot;APC_UPLOAD_PROGRESS&quot; type=&quot;hidden&quot; value=&quot;<span style="color: #009900;">&lt; ?php echo $id_for_apc ?&gt;</span>&quot; /&gt;
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">input</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;leFichier&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;leFichier&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">input</span></a> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Charger le fichier&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/form.html"><span style="color: #000000; font-weight: bold;">form</span></a>&gt;</span>
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span>Total du fichier : <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/span.html"><span style="color: #000000; font-weight: bold;">span</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;total&quot;</span>&gt;</span>Inconnu<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/span.html"><span style="color: #000000; font-weight: bold;">span</span></a>&gt;&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span>
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span>En cours : <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/span.html"><span style="color: #000000; font-weight: bold;">span</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;current&quot;</span>&gt;</span>0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/span.html"><span style="color: #000000; font-weight: bold;">span</span></a>&gt;&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span></pre></td></tr></table></div>

<p>Tout ce qu&#8217;il y a de plus simple. Le script <code>traitement.php</code> est quant à lui tout ce qu&#8217;il y a de plus classique pour traiter des fichiers téléchargés. Son résultat va s&#8217;afficher dans l&#8217;Iframe caché, il faudra donc y récupérer les informations pour afficher le résultat final de l&#8217;upload.</p>
<h4>Direction le javascript maintenant</h4>
<p>Lors de la soumission du formulaire, la fonction <code>pollProgress</code> est appelée avec en paramètre la valeur du champ <code>APC_UPLOAD_PROGRESS</code>. Personnellement, je préfère cette méthode car il est plus sûr de passer l&#8217;id en argument que d&#8217;aller la chercher dans le document Html de départ qui peut avoir changé ou qui possède des frames (argh !).</p>
<p>Le but de <code>pollProgress</code> est d&#8217;interroger le serveur en utilisant l&#8217;objet <code>XMLHttpRequest</code>. Pour cela, soit on programme tout de zéro, soit on utilise un framework javascript. Personnellement, j&#8217;utilise <a href="http://prototypejs.org/">Prototype</a> car, d&#8217;une part, il est également utilisé par <a href="http://script.aculo.us/">script.aculo.us</a>, bibliothèque d&#8217;effets javascript et, d&#8217;autre part, il permet des manipulations du DOM en gérant lui-même les spécificités d&#8217;Internet Explorer.</p>
<p>Notre fonction <code>pollProgress(upload_id)</code> pourrait ressembler à ceci :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p37code10'); return false;">View Code</a> JAVASCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p3710"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code" id="p37code10"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> pollProgress<span style="color: #009900;">&#40;</span>upload_id<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
   <span style="color: #003366; font-weight: bold;">new</span> Ajax.<span style="color: #660066;">Request</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'getUploadProgress.php?upload_id='</span><span style="color: #339933;">+</span>upload_id<span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
                     method <span style="color: #339933;">:</span> <span style="color: #3366CC;">'GET'</span><span style="color: #339933;">,</span>
                     onSuccess<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>transport<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                   <span style="color: #003366; font-weight: bold;">var</span> upload_info <span style="color: #339933;">=</span> transport.<span style="color: #660066;">responseJSON</span><span style="color: #339933;">;</span>
                                   <span style="color: #006600; font-style: italic;">/* Les informations retournés par le serveur
                                      sont disponibles dans l'objet upload_info
                                      (total, current, filename, name et done) */</span>
                                   <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>upload_info.<span style="color: #660066;">done</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                      $<span style="color: #009900;">&#40;</span>current<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span>upload_info.<span style="color: #660066;">current</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                      $<span style="color: #009900;">&#40;</span>total<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span>upload_info.<span style="color: #660066;">total</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                      <span style="color: #009966; font-style: italic;">/* Si le chargement n'est pas fini, on relance la fonction */</span>
                                      <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>upload_info.<span style="color: #660066;">done</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> pollProgress<span style="color: #009900;">&#40;</span>upload_id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                    <span style="color: #009900;">&#125;</span>
                                  <span style="color: #009900;">&#125;</span>
                                <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>C&#8217;est évidemment l&#8217;approche a minima car on se contente d&#8217;actualiser la valeur de la taille du fichier (total) et de la quantité d&#8217;octets chargés (current). Enfin, en divisant l&#8217;un par l&#8217;autre, on a un taux de progression que l&#8217;on peut représenter graphiquement&#8230;</p>
<p>Le grand avantage de Prototype est qu&#8217;il simplifie fortement le code et, en exploitant le format JSON, on peut récupérer directement les informations sous forme de variables javascript.</p>
<p>En attendant, il manque le script PHP qui va gentiment nous donner ces informations au format JSON :</p>
<p>Pas bien sorcier. Toute la magie repose sur <code>apc_fetch</code> qui va renvoyer un tableau associatif <code>$ret[index]</code> où index possédant les valeurs suivantes :</p>
<ul>
<li><strong>total</strong> : taille du fichier en octets</li>
<li><strong>current</strong> : nombre d&#8217;octets déjà reçus</li>
<li><strong>filename</strong> : nom du fichier tel que transmis dans l&#8217;input file</li>
<li><strong>name</strong> : valeur de l&#8217;attribut name de l&#8217;input file</li>
<li><strong>start-time</strong> : timestamp du début du chargement</li>
<li><strong>done</strong> : statut du chargement (0 : en cours, 1 : fini)</li>
</ul>
<p>Une fois le chargement fini, la fonction renvoie également ces valeurs d&#8217;index :</p>
<ul>
<li> <strong>temp_filename</strong> : chemin vers le fichier temporaire</li>
<li> <strong>rate</strong> : Taux de transfert en b/s</li>
<li> <strong>cancel_upload</strong> : Information sur le résultat de l&#8217;upload (0 : succès, 1 : la taille du fichier excède upload_max_file_size, 2 : la taille excède MAX_FILE_SIZE, 3 : chargement partiel, 4 : pas de fichier chargé, 5 : le répertoire temporaire est absent, 6 : impossible d&#8217;écrire le fichier, 7 : chargement annulé)</li>
</ul>
<p>Fort heureusement, l&#8217;annulation d&#8217;un chargement change malgré tout la valeur de l&#8217;index <code>"done"</code> en 1 sinon nous aurions une jolie boucle infinie dans le script ! A noter que les informations fournies à la fin du chargement sont également disponibles dans <code>$_FILES</code>.</p>
<p>Enfin, la fonction <code>json_encode</code> nous permet de passer le tableau de retour au format JSON pour la fonction javascript.</p>
<p>Le script est loin d&#8217;être complet mais je pense que c&#8217;est une bonne base de départ pour celui qui veut se lancer.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.bafouille.fr%2Fweb%2Fajax-web%2Fconnaitre-la-progression-dun-chargement-upload-de-fichier-en-php%2F&amp;title=Conna%C3%AEtre%20la%20progression%20d%26%238217%3Bun%20chargement%20%28upload%29%20de%20fichier%20en%20PHP" id="wpa2a_12"><img src="http://blog.bafouille.fr/social.gif" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bafouille.fr/web/ajax-web/connaitre-la-progression-dun-chargement-upload-de-fichier-en-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Chargement de fichier (upload) en ajax</title>
		<link>http://blog.bafouille.fr/web/chargement-de-fichier-upload-en-ajax/</link>
		<comments>http://blog.bafouille.fr/web/chargement-de-fichier-upload-en-ajax/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 22:54:17 +0000</pubDate>
		<dc:creator>Bafouille</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[chargement]]></category>
		<category><![CDATA[fichiers]]></category>
		<category><![CDATA[formulaire]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://blog.bafouille.fr/?p=16</guid>
		<description><![CDATA[Comme beaucoup découvrant Ajax, je m&#8217;enthousiasmais à l&#8217;idée de soumettre des formulaires tout en évitant des rechargements de page laborieux. Je ne reviendrais pas ici sur ce qu&#8217;est Ajax, on en trouvera une excellente explication sur Wikipédia. Clavier faisant, je soumettais requête sur requête jusqu’à buter sur un os, un gros os. Tout marchait à [...]]]></description>
			<content:encoded><![CDATA[<p>Comme beaucoup découvrant Ajax, je m&#8217;enthousiasmais à l&#8217;idée de soumettre des formulaires tout en évitant des rechargements de page laborieux.</p>
<p>Je ne reviendrais pas ici sur ce qu&#8217;est Ajax, on en trouvera une excellente explication sur <a title="Article de Wikipédia sur Ajax" href="http://fr.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML">Wikipédia</a>. Clavier faisant, je soumettais requête sur requête jusqu’à buter sur un os, un gros os.</p>
<p>Tout marchait à merveille à l’exception notable de l’upload de fichier vers un serveur. La raison ?</p>
<p>L’objet XMLHttpRequest, utilisé par Ajax pour échanger avec le serveur, ne gère pas les données binaires. Plus simplement, impossible de soumettre directement le fichier avec un formulaire prévu pour le transfert de fichier grâce à <code>enctype=”multipart/form-data”</code>.</p>
<p>Il n&#8217;y aucune parade pour l&#8217;instant en la forme actuelle de l&#8217;objet XMLHttpRequest à part simuler une absence de rechargement de la page.</p>
<p>Faute de grives, on se contente de merles et quelques expédients sont possibles. La plupart sont listés sur ce<a title="Simulation d'upload en ajax" href="http://www.xorax.info/blog/programmation/127-ajax-upload-input-file.html"> blog</a>.</p>
<p>La solution avec un iframe masqué a ma préférence car c&#8217;est la plus portable. Les vrais soucis commencent quand on veut afficher la progression du chargement.</p>
<p><span style="text-decoration: underline;"><strong>Pour plus de renseignements :</strong></span></p>
<ul>
<li><a href="http://blog.bafouille.fr/?p=37">Upload de fichiers grâce à l&#8217;extension APC de PHP et affichage de la progression du chargement<br />
</a></li>
<li><a href="http://blog.bafouille.fr/?p=148">Upload de fichiers via Flash et affichage de la progression du chargement</a></li>
</ul>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.bafouille.fr%2Fweb%2Fchargement-de-fichier-upload-en-ajax%2F&amp;title=Chargement%20de%20fichier%20%28upload%29%20en%20ajax" id="wpa2a_14"><img src="http://blog.bafouille.fr/social.gif" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bafouille.fr/web/chargement-de-fichier-upload-en-ajax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

