Zend_File_Transfer-Introduction.xml 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 17618 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.file.transfer.introduction">
  5. <title>Zend_File_Transfer</title>
  6. <para>
  7. <classname>Zend_File_Transfer</classname> bietet exzessiven Support für Datei Uploads und
  8. Downloads. Es kommt mit eingebauten Prüfungen für Dateien und Funktionslitäten um Dateien
  9. mit Filtern zu verändern. Protokoll-Adapter erlauben
  10. <classname>Zend_File_Transfer</classname> die selbe <acronym>API</acronym> für
  11. Transportprotokolle wie <acronym>HTTP</acronym>, FTP, WEBDAV und andere zu verwenden.
  12. </para>
  13. <note>
  14. <title>Einschränkungen</title>
  15. <para>
  16. Die aktuelle Implementation von <classname>Zend_File_Transfer</classname>
  17. ist auf <acronym>HTTP</acronym> Post Uploads limitiert. Andere Adapter die Downloads und
  18. andere Protokolle unterstützen werden in zukünftigen Releases hinzugefügt. Aktuell
  19. sollte <classname>Zend_File_Transfer_Adapter_Http</classname> direkt verwendet werden.
  20. Sobald andere Adapter vorhanden sind, kann ein gemeinsames Interface verwendet werden.
  21. </para>
  22. </note>
  23. <note>
  24. <title>Formulare</title>
  25. <para>
  26. Wenn man <classname>Zend_Form</classname> verwendet sollte man die
  27. <acronym>API</acronym>s die von <classname>Zend_Form</classname> zur Verfügung gestellt
  28. werden, und <classname>Zend_File_Transfer</classname> nicht direkt, verwenden. Der
  29. Dateitransfer Support von <classname>Zend_Form</classname> ist in
  30. <classname>Zend_File_Transfer</classname> implementiert, weshalb die Informationen in
  31. diesem Kapitel für fortgeschrittene Benutzer von <classname>Zend_Form</classname>
  32. interessant sind.
  33. </para>
  34. </note>
  35. <para>
  36. Die Verwendung von <classname>Zend_File_Transfer</classname> ist relativ einfach. Es besteht
  37. aus zwei Teilen. Dem <acronym>HTTP</acronym> Formular, wärend
  38. <classname>Zend_File_Transfer</classname> die hochgeladenen Dateien behandelt. Siehe das
  39. folgende Beispiel:
  40. </para>
  41. <example id="zend.file.transfer.introduction.example">
  42. <title>Einfaches Formular für File-Uploads</title>
  43. <para>
  44. Dieses Beispiel zeigt einen einfachen Dateiupload. Das erste Teil ist das Dateiformular.
  45. In unserem Beispiel gibt es nur eine Datei welche wir hochladen wollen.
  46. </para>
  47. <programlisting language="xml"><![CDATA[
  48. <form enctype="multipart/form-data" action="/file/upload" method="POST">
  49. <input type="hidden" name="MAX_FILE_SIZE" value="100000" />
  50. Choose a file to upload: <input name="uploadedfile" type="file" />
  51. <br />
  52. <input type="submit" value="Upload File" />
  53. </form>
  54. ]]></programlisting>
  55. <para>
  56. Der Bequemlichkeit halber kann
  57. <link linkend="zend.form.standardElements.file">Zend_Form_Element_File</link> verwendet
  58. werden statt das HTML manuell zu erstellen.
  59. </para>
  60. <para>
  61. Der nächste Schritt ist die Erstellung des Empfängers des Uploads. In unserem Beispiel
  62. ist der Empfänger bei <code>/file/upload</code> zu finden. Als nächstes erstellen wir
  63. also den <code>file</code> Controller mit der <code>upload</code> Aktion.
  64. </para>
  65. <programlisting language="php"><![CDATA[
  66. $adapter = new Zend_File_Transfer_Adapter_Http();
  67. $adapter->setDestination('C:\temp');
  68. if (!$adapter->receive()) {
  69. $messages = $adapter->getMessages();
  70. echo implode("\n", $messages);
  71. }
  72. ]]></programlisting>
  73. <para>
  74. Dieses Codebeispiel demonstriert die einfachste Verwendung von
  75. <classname>Zend_File_Transfer</classname>. Ein lokales Ziel wird mit der
  76. <code>setDestination</code> Methode definiert, und anschließend die
  77. <methodname>receive()</methodname> Methode aufgerufen. Wenn irgendwelche Uploadfehler
  78. auftreten werden diese als Ausnahme zurückgegeben.
  79. </para>
  80. </example>
  81. <note>
  82. <title>Achtung</title>
  83. <para>
  84. Dieses Beispiel ist nur für die Demonstration der grundsätzlichen <acronym>API</acronym>
  85. von <classname>Zend_File_Transfer</classname>. Man sollte dieses Code Beispiel
  86. <emphasis>niemals</emphasis> in einer Produktivumgebung einsetzen da es massive
  87. Sicherheitslücken aufweisst. Man sollte immer Prüfungen verwenden um die Sicherheit
  88. zu erhöhen.
  89. </para>
  90. </note>
  91. <sect2 id="zend.file.transfer.introduction.adapters">
  92. <title>Von Zend_File_Transfer unterstützte Adapter</title>
  93. <para>
  94. <classname>Zend_File_Transfer</classname> wurde designt um verschiedenste Adapter und
  95. auch Richtungen zu unterstützen. Mit <classname>Zend_File_Transfer</classname> kann man
  96. Dateien Hochladen, Herunterladen und sogar Weiterleiten (Hochladen mit einem Adapter und
  97. Herunterladen mit einem anderen Adapter zur gleichen Zeit).
  98. </para>
  99. </sect2>
  100. <sect2 id="zend.file.transfer.introduction.options">
  101. <title>Optionen für Zend_File_Transfer</title>
  102. <para>
  103. <classname>Zend_File_Transfer</classname> und seine Adapter unterstützen verschiedene
  104. Optionen. Alle Optionen können gesetzt werden indem Sie entweder dem Constructor
  105. übergeben werden, oder durch Aufruf der <methodname>setOptions($options)</methodname>.
  106. <methodname>getOptions()</methodname> gibt die Optionen zurück die aktuell gesetzt
  107. sind. Nachfolgend ist eine Liste aller unterstützten Optionen:
  108. </para>
  109. <itemizedlist>
  110. <listitem>
  111. <para>
  112. <emphasis>ignoreNoFile</emphasis>: Wenn diese Option auf true gesetzt ist,
  113. ignorieren alle Prüfer Dateien die nicht vom Formular hochgeladen wurde. Der
  114. Standardwert ist false, was einen Fehler verursacht wenn die Datei nicht
  115. spezifiziert wurde.
  116. </para>
  117. </listitem>
  118. </itemizedlist>
  119. </sect2>
  120. <sect2 id="zend.file.transfer.introduction.checking">
  121. <title>Dateien prüfen</title>
  122. <para>
  123. <classname>Zend_File_Transfer</classname> hat verschiedene Methoden die auf
  124. verschiedenste Stati von spezifizierten Dateien prüfen. Diese sind nützlich wenn man
  125. Dateien bearbeiten will nachdem Sie empfangen wurden. Diese Methoden beinhalten:
  126. </para>
  127. <itemizedlist>
  128. <listitem>
  129. <para>
  130. <emphasis>isValid($files = null)</emphasis>: Diese Methode prüft ob die
  131. angegebene Datei gültig ist, basierend auf den Prüfungen welche dieser Datei
  132. angehängt sind. Wenn keine Dateien spezifiziert wurden, werden alle Dateien
  133. geprüft. Man kann <methodname>isValid()</methodname> aufrufen bevor
  134. <methodname>receive()</methodname> aufgerufen wird; in diesem Fall ruft
  135. <methodname>receive()</methodname> intern <code>isValid()</code> nicht mehr
  136. auf.
  137. </para>
  138. </listitem>
  139. <listitem>
  140. <para>
  141. <emphasis>isUploaded($files = null)</emphasis>: Diese Methode prüft ob die
  142. spezifizierte Datei vom Benutzer hochgeladen wurde. Das ist nützlich wenn man
  143. eine oder mehrere Dateien definiert hat. Wenn keine Dateien spezifiziert wurden,
  144. werden alle Dateien geprüft.
  145. </para>
  146. </listitem>
  147. <listitem>
  148. <para>
  149. <emphasis>isReceived($files = null)</emphasis>: Diese Methode prüft ob die
  150. spezifizierte Datei bereits empfangen wurde. Wenn keine Dateien angegeben
  151. wurden, werden alle Dateien geprüft.
  152. </para>
  153. </listitem>
  154. </itemizedlist>
  155. <example id="zend.file.transfer.introduction.checking.example">
  156. <title>Dateien prüfen</title>
  157. <programlisting language="php"><![CDATA[
  158. $upload = new Zend_File_Transfer();
  159. // Gibt alle bekannten internen Datei Informationen zurück
  160. $files = $upload->getFileInfo();
  161. foreach ($files as $file => $info) {
  162. // Datei hochgeladen ?
  163. if (!$upload->isUploaded($file)) {
  164. print "Warum hast Du die Datei nicht hochgeladen ?";
  165. continue;
  166. }
  167. // Prüfungen sind ok ?
  168. if (!$upload->isValid($file)) {
  169. print "Sorry, aber die Datei ist nicht das was wir wollten";
  170. continue;
  171. }
  172. }
  173. $upload->receive();
  174. ]]></programlisting>
  175. </example>
  176. </sect2>
  177. <sect2 id="zend.file.transfer.introduction.informations">
  178. <title>Zusätzliche Dateiinformationen</title>
  179. <para>
  180. <classname>Zend_File_Transfer</classname> kann zusätzliche Informationen über Dateien
  181. zurückgeben. Die folgenden Methoden sind vorhanden:
  182. </para>
  183. <itemizedlist>
  184. <listitem>
  185. <para>
  186. <emphasis>getFileName($file = null, $path = true)</emphasis>: Diese Methode
  187. gibt den wirklichen Namen der übertragenen Datei zurück.
  188. </para>
  189. </listitem>
  190. <listitem>
  191. <para>
  192. <emphasis>getFileInfo($file = null)</emphasis>: Diese Methode gibt die
  193. internen Informationen für die angegebene übertragene Datei zurück.
  194. </para>
  195. </listitem>
  196. <listitem>
  197. <para>
  198. <emphasis>getFileSize($file = null)</emphasis>: Diese Methode gibt die
  199. echte Dateigröße für die angegebene Datei zurück.
  200. </para>
  201. </listitem>
  202. <listitem>
  203. <para>
  204. <emphasis>getHash($hash = 'crc32', $files = null)</emphasis>: Diese Methode
  205. gibt einen Hash des Inhalts einer angegebenen übertragenen Datei zurück.
  206. </para>
  207. </listitem>
  208. <listitem>
  209. <para>
  210. <emphasis>getMimeType($files = null)</emphasis>: Diese Methode gibt den
  211. Mimetyp der angegebenen übertragenen Datei zurück.
  212. </para>
  213. </listitem>
  214. </itemizedlist>
  215. <para>
  216. <methodname>getFileName()</methodname> akzeptiert den Namen des Elements als ersten
  217. Parameter. Wenn kein Name angegeben wird, werden alle bekannten Dateinamen in einem
  218. Array zurückgegeben. Wenn die Datei eine MultiDatei ist, wird auch ein Array
  219. zurückgegeben. Wenn nur eine einzelne Datei vorhanden ist wird nur ein String
  220. zurückgegeben.
  221. </para>
  222. <para>
  223. Standardmäßig werden Dateinamen mit dem kompletten Pfad zurückgegeben. Wenn man nur den
  224. Dateinamen ohne Pfad benötigt, kann der zweite Parameter <varname>$path</varname>
  225. gesetzt werden, welcher den Dateinamen ausschneidet wenn er auf false gesetzt wird.
  226. </para>
  227. <example id="zend.file.transfer.introduction.informations.example1">
  228. <title>Den Dateinamen bekommen</title>
  229. <programlisting language="php"><![CDATA[
  230. $upload = new Zend_File_Transfer();
  231. $upload->receive();
  232. // Gibt die Dateinamen aller Dateien zurück
  233. $names = $upload->getFileName();
  234. // Gibt den Dateinamen des Formularelements 'foo' zurück
  235. $names = $upload->getFileName('foo');
  236. ]]></programlisting>
  237. </example>
  238. <note>
  239. <para>
  240. Es ist zu beachten das sich der Dateinamen ändern kann nachdem die Datei empfangen
  241. wurde (receive) weil alle Filter angewendet werden, sobald die Datei empfangen
  242. wurde. Deswegen sollte man <methodname>getFileName()</methodname> immer ausführen
  243. nachdem die Dateien empfangen wurden.
  244. </para>
  245. </note>
  246. <para>
  247. <methodname>getFileSize()</methodname> gibt standardmäßig die echte Dateigröße in SI
  248. Schreibweise zurück was bedeutet das man <code>2kB</code> statt <code>2048</code>
  249. erhält. Wenn man die reine Größe benötigt muß man die <code>useByteString</code> Option
  250. auf false setzen.
  251. </para>
  252. <example id="zend.file.transfer.introduction.informations.example.getfilesize">
  253. <title>Die Größe einer Datei erhalten</title>
  254. <programlisting language="php"><![CDATA[
  255. $upload = new Zend_File_Transfer();
  256. $upload->receive();
  257. // Gibt die Größen aller Dateien als Array zurück
  258. // wenn mehr als eine Datei hochgeladen wurde
  259. $size = $upload->getFileSize();
  260. // Wechsle die SI Schreibweise damit reine Nummern zurückgegeben werden
  261. $upload->setOption(array('useByteString' => false));
  262. $size = $upload->getFileSize();
  263. ]]></programlisting>
  264. </example>
  265. <para>
  266. <methodname>getHash()</methodname> akzeptiert den Namen eines Hash Algorithmus als
  267. ersten Parameter. Für eine Liste bekannter Algorithmen kann in
  268. <ulink url="http://php.net/hash_algos">PHP's hash_algos Methode</ulink> gesehen werden.
  269. Wenn kein Algorithmus spezifiziert wird, wird <code>crc32</code> als Standardalgorithmus
  270. verwendet.
  271. </para>
  272. <example id="zend.file.transfer.introduction.informations.example2">
  273. <title>Den Hash einer Datei erhalten</title>
  274. <programlisting language="php"><![CDATA[
  275. $upload = new Zend_File_Transfer();
  276. $upload->receive();
  277. // Gibt die Hashes von allen Dateien als Array zurück
  278. // wenn mehr als eine Datei hochgeladen wurde
  279. $hash = $upload->getHash('md5');
  280. // Gibt den Has für das 'foo' Formularelement zurück
  281. $names = $upload->getHash('crc32', 'foo');
  282. ]]></programlisting>
  283. </example>
  284. <note>
  285. <para>
  286. Es ist zu beachten das der zurückgegebene Wert ein Array ist, wenn die Datei oder
  287. der Formularname mehr als eine Datei enthält.
  288. </para>
  289. </note>
  290. <para>
  291. <methodname>getMimeType()</methodname> gibt den Mimetyp einer Datei zurück. Wenn mehr
  292. als eine Datei hochgeladen wurde wird ein Array zurückgegeben, andernfalls ein String.
  293. </para>
  294. <example id="zend.file.transfer.introduction.informations.getmimetype">
  295. <title>Den Mimetyp einer Datei bekommen</title>
  296. <programlisting language="php"><![CDATA[
  297. $upload = new Zend_File_Transfer();
  298. $upload->receive();
  299. $mime = $upload->getMimeType();
  300. // Gibt den Mimetyp des 'foo' Form Elements zurück
  301. $names = $upload->getMimeType('foo');
  302. ]]></programlisting>
  303. </example>
  304. <note>
  305. <para>
  306. Beachte das diese Methode die fileinfo Erweiterung verwendet wenn Sie vorhanden ist.
  307. Wenn diese Erweiterung nicht gefunden werden kann wird die mimemagic Erweiterung
  308. verwendet. Wenn keine Erweiterung gefunden wird, dann wird der Mimetyp verwendet der
  309. vom Dateiserver wärend des Hochladens der Datei angegeben wurde.
  310. </para>
  311. </note>
  312. </sect2>
  313. <sect2 id="zend.file.transfer.introduction.uploadprogress">
  314. <title>Fortschritt für Datei Uploads</title>
  315. <para>
  316. <classname>Zend_File_Transfer</classname> kann den aktuellen Status eines gerade
  317. stattfindenden Datei Uploads erheben. Um dieses Feature zu verwenden muß man entweder
  318. die <acronym>APC</acronym> Erweiterung verwenden, die mit den meisten standardmäßigen
  319. <acronym>PHP</acronym> Installationen vorhanden ist, oder die
  320. <code>uploadprogress</code> Erweiterung. Beide Erweiterungen werden erkannt und
  321. automatisch verwendet. Um den Fortschritt zu erhalten muß man einige Voraussetzungen
  322. erfüllen.
  323. </para>
  324. <para>
  325. Erstens, muß man entweder <acronym>APC</acronym> oder <code>uploadprogress</code>
  326. aktiviert haben. Es ist zu beachten das dieses Feature von <acronym>APC</acronym> in
  327. der eigenen php.ini ausgeschaltet werden kann.
  328. </para>
  329. <para>
  330. Zweitens, muß man die richtigen unsichtbaren Felder im Formular hinzugefügt haben das
  331. die Dateien sendet. Wenn man <classname>Zend_Form_Element_File</classname> verwendet
  332. werden diese unsichtbaren Felder automatisch von <classname>Zend_Form</classname>
  333. hinzugefügt.
  334. </para>
  335. <para>
  336. Wenn die oberen zwei Punkte vorhanden sind dann ist man in der Lage den aktuellen
  337. Fortschritt des Datei uploads zu erhalten indem man die <code>getProgress</code> Methode
  338. verwendet. Aktuell gibt es 2 offizielle Wege um das hand zu haben.
  339. </para>
  340. <sect3 id="zend.file.transfer.introduction.uploadprogress.progressadapter">
  341. <title>Verwenden eines Progressbar Adapters</title>
  342. <para>
  343. Man kann einen bequemen <emphasis>Zend_ProgressBar</emphasis> verwenden um den
  344. aktuellen Fortschritt zu erhalten und kann Ihn dann auf einfachem Wege dem Benutzer
  345. zeigen.
  346. </para>
  347. <para>
  348. Um das zu ermöglichen, muß man den gewünschten
  349. <emphasis>Zend_ProgressBar_Adapter</emphasis> bei
  350. <methodname>getProgress()</methodname> hinzufügen wenn es das erste Mal aufgerufen
  351. wird. Für Details über den zu verwendenden Adapter, bitte im Kapitel <link
  352. linkend="zend.progressbar.adapters">Zend_ProgressBar Standard Adapters</link>
  353. nachsehen.
  354. </para>
  355. <example id="zend.file.transfer.introduction.uploadprogress.progressadapter.example1">
  356. <title>
  357. Verwenden eines Progressbar Adapters um den aktuellen Status zu erhalten
  358. </title>
  359. <programlisting language="php"><![CDATA[
  360. $adapter = new Zend_ProgressBar_Adapter_Console();
  361. $upload = Zend_File_Transfer_Adapter_Http::getProgress($adapter);
  362. $upload = null;
  363. while (!$upload['done']) {
  364. $upload = Zend_File_Transfer_Adapter_Http:getProgress($upload);
  365. }
  366. ]]></programlisting>
  367. </example>
  368. <para>
  369. Die komplette Handhabung wird von <methodname>getProgress()</methodname> im
  370. Hintergrund durchgeführt.
  371. </para>
  372. </sect3>
  373. <sect3 id="zend.file.transfer.introduction.uploadprogress.manually">
  374. <title>getProgress() händisch verwenden</title>
  375. <para>
  376. Man kann mit <methodname>getProgress()</methodname> auch händisch arbeiten, also
  377. ohne die Verwendung von <classname>Zend_ProgressBar</classname>.
  378. </para>
  379. <para>
  380. <methodname>getProgress()</methodname> muß ohne Einstellungen aufgerufen werden. Es
  381. gibt anschließend ein Array mit verschiedenen Schlüssel zurück. Sie unterscheiden
  382. sich, abhängig von der verwendeten <acronym>PHP</acronym> Extension. Aber die
  383. folgenden Schlüssel werden unabhängig von der Extension zurück gegeben:
  384. </para>
  385. <itemizedlist>
  386. <listitem>
  387. <para>
  388. <emphasis>id</emphasis>: Die ID dieses Uploads. Die ID identifiziert den
  389. Upload in der Extension. Sie wird automatisch geschrieben. Man sollte Sie
  390. nie ändern oder den Wert selbst setzen.
  391. </para>
  392. </listitem>
  393. <listitem>
  394. <para>
  395. <emphasis>total</emphasis>: Die komplette Größe der Datei die hochgeladen
  396. wird in Bytes als Integer.
  397. </para>
  398. </listitem>
  399. <listitem>
  400. <para>
  401. <emphasis>current</emphasis>: Die aktuelle hochgeladene Größe der
  402. Datei in Bytes als Integer.
  403. </para>
  404. </listitem>
  405. <listitem>
  406. <para>
  407. <emphasis>rate</emphasis>: Die durchschnittliche Geschwindigkeit des
  408. Uploads in Bytes pro Sekunde als Integer.
  409. </para>
  410. </listitem>
  411. <listitem>
  412. <para>
  413. <emphasis>done</emphasis>: Gibt true zurück wenn der Upload abgeschlossen
  414. wurde, andernfalls false.
  415. </para>
  416. </listitem>
  417. <listitem>
  418. <para>
  419. <emphasis>message</emphasis>: Die aktuelle Meldung. Entweder der
  420. Fortschritt als Text in der Form <emphasis>10kB / 200kB</emphasis>, oder
  421. eine hilfreiche Nachricht im Fall eines Problems. Probleme könnten sein,
  422. das kein Upload durchgeführt wird, das ein Fehler wärend des Empfangens der
  423. Daten, für den Fortschritt, aufgetreten ist, oder das der Upload abgebrochen
  424. wurde.
  425. </para>
  426. </listitem>
  427. <listitem>
  428. <para>
  429. <emphasis>progress</emphasis>: Dieser optionale Schlüssel nimmt eine
  430. Instanz von <classname>Zend_ProgressBar_Adapter</classname> oder
  431. <classname>Zend_ProgressBar</classname>, und erlaubt es, den aktuellen
  432. Status des Uploads, in einer Progressbar zu erhalten
  433. </para>
  434. </listitem>
  435. <listitem>
  436. <para>
  437. <emphasis>session</emphasis>: Dieser optionale Schlüssel nimmt den Namen
  438. eines Session Namespaces entgegen der in
  439. <classname>Zend_ProgressBar</classname> verwendet wird. Wenn dieser
  440. Schlüssel nicht angegeben wird, ist er standardmäßig
  441. <classname>Zend_File_Transfer_Adapter_Http_ProgressBar</classname>.
  442. </para>
  443. </listitem>
  444. </itemizedlist>
  445. <para>
  446. Alle anderen zurückgegebenen Schlüssel werden direkt von den Extensions übernommen
  447. und werden nicht geprüft.
  448. </para>
  449. <para>
  450. Das folgende Beispiel zeigt eine mögliche händische Verwendung:
  451. </para>
  452. <example id="zend.file.transfer.introduction.uploadprogress.manually.example1">
  453. <title>Händische Verwendung des Datei Fortschritts</title>
  454. <programlisting language="php"><![CDATA[
  455. $upload = Zend_File_Transfer_Adapter_Http::getProgress();
  456. while (!$upload['done']) {
  457. $upload = Zend_File_Transfer_Adapter_Http:getProgress($upload);
  458. print "\nAktueller Fortschritt:".$upload['message'];
  459. // Tu was zu tun ist
  460. }
  461. ]]></programlisting>
  462. </example>
  463. </sect3>
  464. </sect2>
  465. </sect1>
  466. <!--
  467. vim:se ts=4 sw=4 tw=80 et:
  468. -->