Zend_File_Transfer-Introduction.xml 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24658 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.file.transfer.introduction">
  5. <title>Zend_File_Transfer</title>
  6. <para>
  7. <classname>Zend_File_Transfer</classname> permet aux développeurs de contrôler
  8. l'upload de fichiers mais aussi le téléchargement. Il vous permet d'utiliser les validateurs
  9. incorporés pour le traitement de fichier et même la possibilité de changer les fichiers avec
  10. des filtres. <classname>Zend_File_Transfer</classname> fonctionne avec des adaptateurs ce
  11. qui vous permet d'utiliser la même <acronym>API</acronym> pour différents protocoles de transfert <acronym>HTTP</acronym>, FTP,
  12. WEBDAV et plus encore.
  13. </para>
  14. <note>
  15. <title>Limitation</title>
  16. <para>
  17. L'implémentation actuelle de <classname>Zend_File_Transfer</classname> est limitée
  18. aux uploads de type <acronym>HTTP</acronym> Post. Le téléchargement de fichiers et les autres adaptateurs
  19. seront ajoutés dans les prochaines versions. Les méthodes non implémentées pour le
  20. moment lèveront une exception. Donc réellement vous devriez directement utiliser une
  21. instance de <classname>Zend_File_Transfer_Adapter_Http</classname>. Ceci changera dans
  22. le futur, dès qu'il existera des adaptateurs disponibles.
  23. </para>
  24. </note>
  25. <note>
  26. <title>Formulaires</title>
  27. <para>
  28. Quand vous utilisez <classname>Zend_Form</classname> vous devriez lire et suivre
  29. les exemples décrits dans le chapitre <classname>Zend_Form</classname> et ne pas
  30. utiliser manuellement <classname>Zend_File_Transfer</classname>. Mais les informations
  31. que vous pourrez lire dans le présent chapitre vous seront malgré tout utile, même si
  32. vous ne l'utilisez pas directement. Toutes les considérations, descriptions et solutions
  33. sont les mêmes quand vous utilisez <classname>Zend_File_Transfer</classname> au travers
  34. de <classname>Zend_Form</classname>.
  35. </para>
  36. </note>
  37. <para>
  38. L'utilisation de <classname>Zend_File_Transfer</classname> est assez simple. Il
  39. consiste en deux parties. Le formulaire <acronym>HTTP</acronym> qui réalise l'upload, et la gestion des
  40. fichiers uploadés avec <classname>Zend_File_Transfer</classname>. Regardez l'exemple suivant
  41. :
  42. </para>
  43. <example id="zend.file.transfer.introduction.example">
  44. <title>Formulaire simple d'upload de fichier</title>
  45. <para>
  46. Cet exemple illustre un upload de fichier basique avec
  47. <classname>Zend_File_Transfer</classname>. La première partie est le formulaire. Dans
  48. notre exemple, il n'y a qu'un seul fichier que nous souhaitons uploadé.
  49. </para>
  50. <programlisting><![CDATA[
  51. <form enctype="multipart/form-data" action="/file/upload" method="POST">
  52. <input type="hidden" name="MAX_FILE_SIZE" value="100000" />
  53. Choose a file to upload:
  54. <input name="uploadedfile" type="file" />
  55. <br />
  56. <input type="submit" value="Upload File" />
  57. </form>
  58. ]]></programlisting>
  59. <para>
  60. Notez que vous devriez utiliser <link
  61. linkend="zend.form.standardElements.file">Zend_Form_Element_File</link> par simplicité
  62. plutôt que de créer le HTML manuellement.
  63. </para>
  64. <para>
  65. L'étape suivante est de créer le récepteur de l'upload. Dans notre exemple le
  66. récepteur est "<code>/file/upload</code>". Donc nous créons le contrôleur
  67. <code>file</code> avec l'action <code>upload</code>.
  68. </para>
  69. <programlisting language="php"><![CDATA[
  70. $adapter = new Zend_File_Transfer_Adapter_Http();
  71. $adapter->setDestination('C:\temp');
  72. if (!$adapter->receive()) {
  73. $messages = $adapter->getMessages();
  74. echo implode("\n", $messages);
  75. }
  76. ]]></programlisting>
  77. <para>
  78. Comme vous le voyez, l'utilisation la plus simple est de définir une destination
  79. avec la méthode <code>setDestination</code> et d'appeler la méthode
  80. <methodname>receive()</methodname>. S'il apparaît des erreurs au cours de l'upload, alors vous les
  81. récupérerez grâce à une exception qui sera retournée.
  82. </para>
  83. </example>
  84. <note>
  85. <title>Attention</title>
  86. <para>
  87. Maintenez à l'esprit qu'il s'agit de l'utilisation la plus simple. Vous
  88. <emphasis>ne devez jamais</emphasis> utiliser cet exemple en environnement de production
  89. car il causerait de graves problèmes de sécurité. Vous devez toujours utiliser des
  90. validateurs pour accroître la sécurité.
  91. </para>
  92. </note>
  93. <sect2 id="zend.file.transfer.introduction.adapters">
  94. <title>Adaptateurs supportés par Zend_File_Transfer</title>
  95. <para>
  96. <classname>Zend_File_Transfer</classname> est construit pour supporter différents
  97. adaptateurs et différentes directions. Il est conçu pour permettre l'upload, le
  98. téléchargement et même l'envoi bidirectionnel (upload avec un adaptateur et télécharge
  99. avec un autre adaptateur en même temps) de fichiers.
  100. </para>
  101. </sect2>
  102. <sect2 id="zend.file.transfer.introduction.options">
  103. <title>Options de Zend_File_Transfer</title>
  104. <para>
  105. <classname>Zend_File_Transfer</classname> et ses adaptateurs supportent plusieurs
  106. options. Vous pouvez paramétrer toutes les options soit en les fournissant au
  107. constructeur, ou en utilisant <methodname>setOptions($options)</methodname>.
  108. <methodname>getOptions()</methodname> retournera les options actuellement paramétrées. Ci-dessous,
  109. vous trouverez la liste des options supportées :
  110. </para>
  111. <itemizedlist>
  112. <listitem>
  113. <para>
  114. <code>ignoreNoFile</code> : si cette option vaut <constant>TRUE</constant>, tous
  115. les validateurs ignoreront le fait que le fichier à été uploadé ou non par le
  116. formulaire. Cette option vaut par défaut <constant>FALSE</constant>, ce qui lance une
  117. erreur indiquant que le fichier n'a pas été fourni.
  118. </para>
  119. </listitem>
  120. </itemizedlist>
  121. </sect2>
  122. <sect2 id="zend.file.transfer.introduction.checking">
  123. <title>Vérification des fichiers</title>
  124. <para>
  125. <classname>Zend_File_Transfer</classname> possède plusieurs méthodes qui
  126. permettent de vérifier suivant différentes considérations. Ceci est particulièrement
  127. utile quand vous devez travailler avec des fichiers qui ont été uploadés.
  128. </para>
  129. <itemizedlist>
  130. <listitem>
  131. <para>
  132. <methodname>isValid($files = null)</methodname> : cette méthode vérifie si le(s)
  133. fichier(s) est(sont) valide(s), en se basant sur les validateurs affectés à
  134. chacun de ces fichiers. Si aucun fichier n'est fourni, tous les fichiers seront
  135. vérifiés. Notez que cette méthode sera appelée en dernier quand les fichiers
  136. seront reçus.
  137. </para>
  138. </listitem>
  139. <listitem>
  140. <para>
  141. <methodname>isUploaded($files = null)</methodname> : cette méthode vérifie si le(s)
  142. fichier(s) fourni(s) a (ont) été uploadé(s) par l'utilisateur. Ceci est utile si
  143. vous avez défini que certains fichiers sont optionnels. Si aucun fichier n'est
  144. fourni, tous les fichiers seront vérifiés.
  145. </para>
  146. </listitem>
  147. <listitem>
  148. <para>
  149. <methodname>isReceived($files = null)</methodname> : cette méthode vérifie si le(s)
  150. fichier(s) fourni(s) a (ont) bien été reçu(s). Si aucun fichier n'est fourni,
  151. tous les fichiers seront vérifiés.
  152. </para>
  153. </listitem>
  154. </itemizedlist>
  155. <example id="zend.file.transfer.introduction.checking.example">
  156. <title>Vérification de fichiers</title>
  157. <programlisting language="php"><![CDATA[
  158. $upload = new Zend_File_Transfer();
  159. // Retourne toutes les informations connues sur le fichier
  160. $files = $upload->getFileInfo();
  161. foreach ($files as $file => $info) {
  162. // Fichier uploadé ?
  163. if (!$upload->isUploaded($file)) {
  164. print "Pourquoi n'avez-vous pas uploadé ce fichier ?";
  165. continue;
  166. }
  167. // Les validateurs sont-ils OK ?
  168. if (!$upload->isValid($file)) {
  169. print "Désolé mais $file ne correspond à ce que nous attendons";
  170. continue;
  171. }
  172. }
  173. $upload->receive();
  174. ]]></programlisting>
  175. </example>
  176. </sect2>
  177. <sect2 id="zend.file.transfer.introduction.informations">
  178. <title>Informations complémentaires sur les fichiers</title>
  179. <para>
  180. <classname>Zend_File_Transfer</classname> peut fournir de multiples informations
  181. complémentaires sur les fichiers. Les méthodes suivantes sont disponibles :
  182. </para>
  183. <itemizedlist>
  184. <listitem>
  185. <para>
  186. <methodname>getFileName($file = null, $path = true)</methodname> : cette méthode
  187. retourne le vrai nom de fichier d'un fichier transféré.
  188. </para>
  189. </listitem>
  190. <listitem>
  191. <para>
  192. <methodname>getFileInfo($file = null)</methodname> : cette méthode retourne tous les
  193. informations internes concernant un fichier transféré donné.
  194. </para>
  195. </listitem>
  196. <listitem>
  197. <para>
  198. <code>getFileSize($file = null) </code>: cette méthode retourne la taille
  199. réelle d'un fichier transféré donné.
  200. </para>
  201. </listitem>
  202. <listitem>
  203. <para>
  204. <code>getHash($hash = 'crc32', $files = null) </code>: cette méthode
  205. retourne la valeur de hachage du contenu d'un fichier transféré donné.
  206. </para>
  207. </listitem>
  208. <listitem>
  209. <para>
  210. <methodname>getMimeType($files = null)</methodname> : cette méthode retourne le type
  211. <acronym>MIME</acronym> d'un fichier transféré donné.
  212. </para>
  213. </listitem>
  214. </itemizedlist>
  215. <para>
  216. <methodname>getFileName()</methodname> accepte le nom d'un élément entant que premier
  217. paramètre. Si aucun n'est fourni, tous les fichiers connus seront retournées sous la
  218. forme d'un tableau. Si le fichier est un "multifile", vous le récupérerez aussi sous la
  219. forme d'un tableau. S'il n'y a qu'un seul fichier alors une chaîne sera
  220. retournée.
  221. </para>
  222. <para>
  223. Par défaut les noms de fichier sont retournés avec leur chemin d'accès complet. Si
  224. vous souhaitez seulement le nom de fichier sans le chemin, vous pouvez paramétrer le
  225. second paramètre <varname>$path</varname> à <constant>FALSE</constant> ce qui tronquera le
  226. chemin.
  227. </para>
  228. <example id="zend.file.transfer.introduction.informations.example1">
  229. <title>Récupération du nom de fichier</title>
  230. <programlisting language="php"><![CDATA[
  231. $upload = new Zend_File_Transfer();
  232. $upload->receive();
  233. // Retourne le nom de fichier pour tous les fichiers
  234. $names = $upload->getFileName();
  235. // Retourne le nom de fichier de l'élément de formulaire "foo"
  236. $names = $upload->getFileName('foo');
  237. ]]></programlisting>
  238. </example>
  239. <note>
  240. <para>
  241. Notez que le nom de fichier peut changer quand vous recevez le fichier. Ceci
  242. est du au fait qu'après la réception, tous les filtres sot appliqués. Donc vous ne
  243. devriez appeler <methodname>getFileName()</methodname> qu'après avoir reçu les fichiers.
  244. </para>
  245. </note>
  246. <para>
  247. <methodname>getFileSize()</methodname> retourne par défaut la taille réelle d'un fichier en
  248. notation SI ce qui signifie que vous récupérerez <code>2kB</code> au lieu de
  249. <constant>2048</constant>. Si vous voulez la taille brute, utilisez l'option
  250. <code>useByteString</code> à <constant>FALSE</constant>.
  251. </para>
  252. <example id="zend.file.transfer.introduction.informations.example.getfilesize">
  253. <title>Récupération de la taille de fichier</title>
  254. <programlisting language="php"><![CDATA[
  255. $upload = new Zend_File_Transfer();
  256. $upload->receive();
  257. // Retourne les tailles de tous les fichiers sous la forme
  258. // d'un tableau si plus d'un fichier a été uploadé
  259. $size = $upload->getFileSize();
  260. // Bascule de la notation SI vers une taille brute
  261. $upload->setOptions(array('useByteString' => false));
  262. $size = $upload->getFileSize();
  263. ]]></programlisting>
  264. </example>
  265. <note>
  266. <title>Client given filesize</title>
  267. <para>
  268. Note that the filesize which is given by the client is not seen as save input.
  269. Therefor the real size of the file will be detected and returned instead of the
  270. filesize sent by the client.
  271. </para>
  272. </note>
  273. <para>
  274. <methodname>getHash()</methodname> accepte le nom de l'algorithme de hachage en tant que
  275. premier paramètre. Pour avoir une liste des algorithmes connus, regardez <ulink
  276. url="http://php.net/manual/fr/function.hash-algos.php">la méthode hash_algos de
  277. <acronym>PHP</acronym></ulink>. Si vous ne fournissez aucun algorithme, celui par défaut sera
  278. <code>crc32</code>.
  279. </para>
  280. <example id="zend.file.transfer.introduction.informations.example2">
  281. <title>Récupération d'un hash de fichier</title>
  282. <programlisting language="php"><![CDATA[
  283. $upload = new Zend_File_Transfer();
  284. $upload->receive();
  285. // Retourne le hachage de fichier pour tous les fichiers sous la forme
  286. // d'un tableau si plusieurs fichiers sont fournis
  287. $hash = $upload->getHash('md5');
  288. // Retourne le hachage de l'élément de formulaire "foo"
  289. $names = $upload->getHash('crc32', 'foo');
  290. ]]></programlisting>
  291. </example>
  292. <note>
  293. <title>Valeur retournée</title>
  294. <para>
  295. Notez que si un fichier ou un élément de formulaire donné contient plus d'un
  296. fichier, la valeur retournée sera un tableau.
  297. </para>
  298. </note>
  299. <para>
  300. <methodname>getMimeType()</methodname> retourne le type <acronym>MIME</acronym> d'un fichier. Si plus d'un
  301. fichier a été uploadé, elle retourne un tableau, sinon c'est une chaîne.
  302. </para>
  303. <example id="zend.file.transfer.introduction.informations.getmimetype">
  304. <title>Récupération du type MIME de fichier</title>
  305. <programlisting language="php"><![CDATA[
  306. $upload = new Zend_File_Transfer();
  307. $upload->receive();
  308. $mime = $upload->getMimeType();
  309. // Retourne le type MIME pour l'élément de formulaire "foo"
  310. $names = $upload->getMimeType('foo');
  311. ]]></programlisting>
  312. </example>
  313. <note>
  314. <title>Client given mimetype</title>
  315. <para>
  316. Note that the mimetype which is given by the client is not seen as save input.
  317. Therefor the real mimetype of the file will be detected and returned instead of the
  318. mimetype sent by the client.
  319. </para>
  320. </note>
  321. <warning>
  322. <title>Exception possible</title>
  323. <para>
  324. Notez que cette méthode utilise l'extension fileinfo si elle est disponible.
  325. Si elle n'est pas trouvé, elle utilise l'extension mimemagic. Quand aucune extension
  326. n'est fournie, une exception est levée.
  327. </para>
  328. </warning>
  329. <warning>
  330. <title>Original data within $_FILES</title>
  331. <para>
  332. Due to security reasons also the original data within $_FILES will be overridden
  333. as soon as <classname>Zend_File_Transfer</classname> is initiated. When you want
  334. to omit this behaviour and have the original data simply set the
  335. <property>detectInfos</property> option to <constant>FALSE</constant> at initiation.
  336. </para>
  337. <para>
  338. This option will have no effect after you initiated
  339. <classname>Zend_File_Transfer</classname>.
  340. </para>
  341. </warning>
  342. </sect2>
  343. <sect2 id="zend.file.transfer.introduction.uploadprogress">
  344. <title>Progress for file uploads</title>
  345. <para>
  346. <classname>Zend_File_Transfer</classname> can give you the actual state of a fileupload in progress. To use
  347. this feature you need either the <constant>APC</constant> extension which is provided with most default
  348. <acronym>PHP</acronym> installations, or the <code>uploadprogress</code> extension. Both extensions are detected
  349. and used automatically. To be able to get the progress you need to meet some prerequisites.
  350. </para>
  351. <para>
  352. First, you need to have either <constant>APC</constant> or <code>uploadprogress</code> to be enabled.
  353. Note that you can disable this feature of <constant>APC</constant> within your php.ini.
  354. </para>
  355. <para>
  356. Second, you need to have the proper hidden fields added in the form which sends the files. When you
  357. use <classname>Zend_Form_Element_File</classname> this hidden fields are automatically added by
  358. <classname>Zend_Form</classname>.
  359. </para>
  360. <para>
  361. When the above two points are provided then you are able to get the actual progress of the
  362. file upload by using the <code>getProgress</code> method. Actually there are 2 official ways to
  363. handle this.
  364. </para>
  365. <sect3 id="zend.file.transfer.introduction.uploadprogress.progressadapter">
  366. <title>Using a progressbar adapter</title>
  367. <para>
  368. You can use the convinient <emphasis>Zend_ProgressBar</emphasis> to get the actual progress
  369. and can display it in a simple manner to your user.
  370. </para>
  371. <para>
  372. To archive this, you have to add the wished <emphasis>Zend_ProgressBar_Adapter</emphasis> to
  373. <methodname>getProgress()</methodname> when you are calling it the first time. For details about the right
  374. adapter to use, look into the chapter
  375. <link linkend="zend.progressbar.adapters">Zend_ProgressBar Standard Adapters</link>.
  376. </para>
  377. <example id="zend.file.transfer.introduction.uploadprogress.progressadapter.example1">
  378. <title>Using the progressbar adapter to retrieve the actual state</title>
  379. <programlisting language="php"><![CDATA[
  380. $adapter = new Zend_ProgressBar_Adapter_Console();
  381. $upload = Zend_File_Transfer_Adapter_Http::getProgress($adapter);
  382. $upload = null;
  383. while (!$upload['done']) {
  384. $upload = Zend_File_Transfer_Adapter_Http:getProgress($upload);
  385. }
  386. ]]></programlisting>
  387. </example>
  388. <para>
  389. The complete handling is done by <methodname>getProgress()</methodname> for you in the background.
  390. </para>
  391. </sect3>
  392. <sect3 id="zend.file.transfer.introduction.uploadprogress.manually">
  393. <title>Using getProgress() manually</title>
  394. <para>
  395. You can also work manually with <methodname>getProgress()</methodname> without the usage of
  396. <classname>Zend_ProgressBar</classname>.
  397. </para>
  398. <para>
  399. Call <methodname>getProgress()</methodname> without settings. It will return you an array with several keys.
  400. They differ according to the used <acronym>PHP</acronym> extension. But the following keys are given independently
  401. of the extension:
  402. </para>
  403. <itemizedlist>
  404. <listitem>
  405. <para>
  406. <emphasis>id</emphasis>: The ID of this upload. This ID identifies the
  407. upload within the extension. You can set it to the value of the hidden key
  408. which identified the upload when initially calling
  409. <methodname>getProgress()</methodname>. Per default it is set to
  410. <emphasis>progress_key</emphasis>. You must not change the ID afterwards.
  411. </para>
  412. </listitem>
  413. <listitem>
  414. <para>
  415. <emphasis>total</emphasis>: The total filesize of the uploaded files in bytes
  416. as integer.
  417. </para>
  418. </listitem>
  419. <listitem>
  420. <para>
  421. <emphasis>current</emphasis>: The current uploaded filesize in bytes
  422. as integer.
  423. </para>
  424. </listitem>
  425. <listitem>
  426. <para>
  427. <emphasis>rate</emphasis>: The average upload speed in bytes per second
  428. as integer.
  429. </para>
  430. </listitem>
  431. <listitem>
  432. <para>
  433. <emphasis>done</emphasis>: Returns true when the upload is finished and false
  434. otherwise.
  435. </para>
  436. </listitem>
  437. <listitem>
  438. <para>
  439. <emphasis>message</emphasis>: The actual message. Eighter the progress as
  440. text in the form <emphasis>10kB / 200kB</emphasis>, or a helpful message
  441. in the case of a problem. Problems could be, that there is no upload in progress, that
  442. there was a failure while retrieving the data for the progress, or that the upload has
  443. been canceled.
  444. </para>
  445. </listitem>
  446. <listitem>
  447. <para>
  448. <emphasis>progress</emphasis>: This optional key takes a instance of
  449. Zend_ProgressBar_Adapter or Zend_ProgressBar and allows to get the actual upload state
  450. within a progressbar.
  451. </para>
  452. </listitem>
  453. <listitem>
  454. <para>
  455. <emphasis>session</emphasis>: This optional key takes the name of a session
  456. namespace which will be used within Zend_ProgressBar. When this key is not given it
  457. defaults to <classname>Zend_File_Transfer_Adapter_Http_ProgressBar</classname>.
  458. </para>
  459. </listitem>
  460. </itemizedlist>
  461. <para>
  462. All other returned keys are provided directly from the extensions and will not be checked.
  463. </para>
  464. <para>
  465. The following example shows a possible manual usage:
  466. </para>
  467. <example id="zend.file.transfer.introduction.uploadprogress.manually.example1">
  468. <title>Manual usage of the file progress</title>
  469. <programlisting language="php"><![CDATA[
  470. $upload = Zend_File_Transfer_Adapter_Http::getProgress();
  471. while (!$upload['done']) {
  472. $upload = Zend_File_Transfer_Adapter_Http:getProgress($upload);
  473. print "\nActual progress:".$upload['message'];
  474. // do whatever you need
  475. }
  476. ]]></programlisting>
  477. </example>
  478. <note>
  479. <title>Knowing the file to get the progress from</title>
  480. <para>
  481. The above example works when your upload identified is set to 'progress_key'.
  482. When you are using another identifier within your form you must give the used
  483. identifier as first parameter to <methodname>getProgress()</methodname> on the
  484. initial call.
  485. </para>
  486. </note>
  487. </sect3>
  488. </sect2>
  489. </sect1>