<?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; upload</title>
	<atom:link href="http://blog.bafouille.fr/tag/upload/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>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_2"><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('p37code3'); return false;">View Code</a> HTML4STRICT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p373"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p37code3"><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('p37code4'); return false;">View Code</a> JAVASCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p374"><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="p37code4"><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_4"><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_6"><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>

