| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 15156 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.file.transfer.introduction">
- <title>Zend_File_Transfer</title>
- <para>
- <classname>Zend_File_Transfer</classname> bietet exzessiven Support für Datei Uploads und Downloads. Es kommt
- mit eingebauten Prüfungen für Dateien und Funktionslitäten um Dateien mit Filtern zu verändern.
- Protokoll-Adapter erlauben <classname>Zend_File_Transfer</classname> die selbe API für Transportprotokolle wie
- HTTP, FTP, WEBDAV und andere zu verwenden.
- </para>
- <note>
- <title>Einschränkungen</title>
- <para>
- Die aktuelle Implementation von <classname>Zend_File_Transfer</classname>
- ist auf HTTP Post Uploads limitiert. Andere Adapter die Downloads und andere Protokolle
- unterstützen werden in zukünftigen Releases hinzugefügt. Aktuell sollte
- <classname>Zend_File_Transfer_Adapter_Http</classname> direkt verwendet werden. Sobald andere Adapter
- vorhanden sind, kann ein gemeinsames Interface verwendet werden.
- </para>
- </note>
- <note>
- <title>Formulare</title>
- <para>
- Wenn man <classname>Zend_Form</classname> verwendet sollte man die APIs die von <classname>Zend_Form</classname> zur
- Verfügung gestellt werden, und <classname>Zend_File_Transfer</classname> nicht direkt, verwenden. Der
- Dateitransfer Support von <classname>Zend_Form</classname> ist in <classname>Zend_File_Transfer</classname>
- implementiert, weshalb die Informationen in diesem Kapitel für fortgeschrittene Benutzer von
- <classname>Zend_Form</classname> interessant sind.
- </para>
- </note>
- <para>
- Die Verwendung von <classname>Zend_File_Transfer</classname> ist relativ einfach. Es besteht aus zwei Teilen.
- Dem HTTP Formular, wärend <classname>Zend_File_Transfer</classname> die hochgeladenen Dateien behandelt.
- Siehe das folgende Beispiel:
- </para>
- <example id="zend.file.transfer.introduction.example">
- <title>Einfaches Formular für File-Uploads</title>
- <para>
- Dieses Beispiel zeigt einen einfachen Dateiupload. Das erste Teil ist das Dateiformular.
- In unserem Beispiel gibt es nur eine Datei welche wir hochladen wollen.
- </para>
- <programlisting><![CDATA[
- <form enctype="multipart/form-data" action="/file/upload" method="POST">
- <input type="hidden" name="MAX_FILE_SIZE" value="100000" />
- Choose a file to upload: <input name="uploadedfile" type="file" />
- <br />
- <input type="submit" value="Upload File" />
- </form>
- ]]></programlisting>
- <para>
- Der Bequemlichkeit halber kann
- <link linkend="zend.form.standardElements.file">Zend_Form_Element_File</link> verwendet werden
- statt das HTML manuell zu erstellen.
- </para>
- <para>
- Der nächste Schritt ist die Erstellung des Empfängers des Uploads. In unserem Beispiel ist der
- Empfänger bei <code>/file/upload</code> zu finden. Als nächstes erstellen wir also den
- <code>file</code> Controller mit der <code>upload</code> Aktion.
- </para>
- <programlisting role="php"><![CDATA[
- $adapter = new Zend_File_Transfer_Adapter_Http();
- $adapter->setDestination('C:\temp');
- if (!$adapter->receive()) {
- $messages = $adapter->getMessages();
- echo implode("\n", $messages);
- }
- ]]></programlisting>
- <para>
- Dieses Codebeispiel demonstriert die einfachste Verwendung von <classname>Zend_File_Transfer</classname>.
- Ein lokales Ziel wird mit der <code>setDestination</code> Methode definiert, und anschließend die
- <code>receive()</code> Methode aufgerufen. Wenn irgendwelche Uploadfehler auftreten werden diese
- als Ausnahme zurückgegeben.
- </para>
- </example>
- <note>
- <title>Achtung</title>
- <para>
- Dieses Beispiel ist nur für die Demonstration der grundsätzlichen API von
- <classname>Zend_File_Transfer</classname>. Man sollte dieses Code Beispiel
- <emphasis role="strong">niemals</emphasis> in einer Produktivumgebung einsetzen da es
- massive Sicherheitslücken aufweisst. Man sollte immer Prüfungen verwenden um die Sicherheit
- zu erhöhen.
- </para>
- </note>
- <sect2 id="zend.file.transfer.introduction.adapters">
- <title>Von Zend_File_Transfer unterstützte Adapter</title>
- <para>
- <classname>Zend_File_Transfer</classname> wurde designt um verschiedenste Adapter und auch Richtungen zu
- unterstützen. Mit <classname>Zend_File_Transfer</classname> kann man Dateien Hochladen, Herunterladen und
- sogar Weiterleiten (Hochladen mit einem Adapter und Herunterladen mit einem anderen Adapter zur
- gleichen Zeit).
- </para>
- </sect2>
- <sect2 id="zend.file.transfer.introduction.options">
- <title>Optionen für Zend_File_Transfer</title>
- <para>
- <classname>Zend_File_Transfer</classname> und seine Adapter unterstützen verschiedene Optionen. Alle Optionen
- können gesetzt werden indem Sie entweder dem Constructor übergeben werden, oder durch Aufruf der
- <code>setOptions($options)</code>. <code>getOptions()</code> gibt die Optionen zurück die aktuell
- gesetzt sind. Nachfolgend ist eine Liste aller unterstützten Optionen:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis role="strong">ignoreNoFile</emphasis>: Wenn diese Option auf true gesetzt ist,
- ignorieren alle Prüfer Dateien die nicht vom Formular hochgeladen wurde. Der
- Standardwert ist false, was einen Fehler verursacht wenn die Datei nicht spezifiziert wurde.
- </para>
- </listitem>
- </itemizedlist>
- </sect2>
- <sect2 id="zend.file.transfer.introduction.checking">
- <title>Dateien prüfen</title>
- <para>
- <classname>Zend_File_Transfer</classname> hat verschiedene Methoden die auf verschiedenste Stati von
- spezifizierten Dateien prüfen. Diese sind nützlich wenn man Dateien bearbeiten will nachdem
- Sie empfangen wurden. Diese Methoden beinhalten:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis role="strong">isValid($files = null)</emphasis>: Diese Methode prüft ob die
- angegebene Datei gültig ist, basierend auf den Prüfungen welche dieser Datei
- angehängt sind. Wenn keine Dateien spezifiziert wurden, werden alle Dateien geprüft.
- Man kann <code>isValid()</code> aufrufen bevor <code>receive()</code> aufgerufen wird;
- in diesem Fall ruft <code>receive()</code> intern <code>isValid()</code> nicht mehr auf.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">isUploaded($files = null)</emphasis>: Diese Methode prüft ob die
- spezifizierte Datei vom Benutzer hochgeladen wurde. Das ist nützlich wenn man eine oder
- mehrere Dateien definiert hat. Wenn keine Dateien spezifiziert wurden, werden alle
- Dateien geprüft.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">isReceived($files = null)</emphasis>: Diese Methode prüft ob die
- spezifizierte Datei bereits empfangen wurde. Wenn keine Dateien angegeben wurden, werden
- alle Dateien geprüft.
- </para>
- </listitem>
- </itemizedlist>
- <example id="zend.file.transfer.introduction.checking.example">
- <title>Dateien prüfen</title>
- <programlisting role="php"><![CDATA[
- $upload = new Zend_File_Transfer();
- // Gibt alle bekannten internen Datei Informationen zurück
- $files = $upload->getFileInfo();
- foreach ($files as $file => $info) {
- // Datei hochgeladen ?
- if (!$upload->isUploaded($file)) {
- print "Warum hast Du die Datei nicht hochgeladen ?";
- continue;
- }
- // Prüfungen sind ok ?
- if (!$upload->isValid($file)) {
- print "Sorry, aber die Datei ist nicht das was wir wollten";
- continue;
- }
- }
- $upload->receive();
- ]]></programlisting>
- </example>
- </sect2>
- <sect2 id="zend.file.transfer.introduction.informations">
- <title>Zusätzliche Dateiinformationen</title>
- <para>
- <classname>Zend_File_Transfer</classname> kann zusätzliche Informationen über Dateien zurückgeben.
- Die folgenden Methoden sind vorhanden:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis role="strong">getFileName($file = null, $path = true)</emphasis>: Diese Methode
- gibt den wirklichen Namen der übertragenen Datei zurück.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">getFileInfo($file = null)</emphasis>: Diese Methode gibt die
- internen Informationen für die angegebene übertragene Datei zurück.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">getFileSize($file = null)</emphasis>: Diese Methode gibt die
- echte Dateigröße für die angegebene Datei zurück.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">getHash($hash = 'crc32', $files = null)</emphasis>: Diese Methode
- gibt einen Hash des Inhalts einer angegebenen übertragenen Datei zurück.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">getMimeType($files = null)</emphasis>: Diese Methode gibt den
- Mimetyp der angegebenen übertragenen Datei zurück.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- <code>getFileName()</code> akzeptiert den Namen des Elements als ersten Parameter. Wenn kein Name
- angegeben wird, werden alle bekannten Dateinamen in einem Array zurückgegeben. Wenn die Datei
- eine MultiDatei ist, wird auch ein Array zurückgegeben. Wenn nur eine einzelne Datei vorhanden ist
- wird nur ein String zurückgegeben.
- </para>
- <para>
- Standardmäßig werden Dateinamen mit dem kompletten Pfad zurückgegeben. Wenn man nur den Dateinamen
- ohne Pfad benötigt, kann der zweite Parameter <code>$path</code> gesetzt werden, welcher den
- Dateinamen ausschneidet wenn er auf false gesetzt wird.
- </para>
- <example id="zend.file.transfer.introduction.informations.example1">
- <title>Den Dateinamen bekommen</title>
- <programlisting role="php"><![CDATA[
- $upload = new Zend_File_Transfer();
- $upload->receive();
- // Gibt die Dateinamen aller Dateien zurück
- $names = $upload->getFileName();
- // Gibt den Dateinamen des Formularelements 'foo' zurück
- $names = $upload->getFileName('foo');
- ]]></programlisting>
- </example>
- <note>
- <para>
- Es ist zu beachten das sich der Dateinamen ändern kann nachdem die Datei empfangen wurde
- (receive) weil alle Filter angewendet werden, sobald die Datei empfangen wurde.
- Deswegen sollte man <code>getFileName()</code> immer ausführen nachdem die Dateien
- empfangen wurden.
- </para>
- </note>
- <para>
- <code>getFileSize()</code> gibt standardmäßig die echte Dateigröße in SI Schreibweise zurück
- was bedeutet das man <code>2kB</code> statt <code>2048</code> erhält. Wenn man die reine
- Größe benötigt muß man die <code>useByteString</code> Option auf false setzen.
- </para>
- <example id="zend.file.transfer.introduction.informations.example.getfilesize">
- <title>Die Größe einer Datei erhalten</title>
- <programlisting role="php"><![CDATA[
- $upload = new Zend_File_Transfer();
- $upload->receive();
- // Gibt die Größen aller Dateien als Array zurück
- // wenn mehr als eine Datei hochgeladen wurde
- $size = $upload->getFileSize();
- // Wechsle die SI Schreibweise damit reine Nummern zurückgegeben werden
- $upload->setOption(array('useByteString' => false));
- $size = $upload->getFileSize();
- ]]></programlisting>
- </example>
- <para>
- <code>getHash()</code> akzeptiert den Namen eines Hash Algorithmus als ersten Parameter. Für eine
- Liste bekannter Algorithmen kann in
- <ulink url="http://php.net/hash_algos">PHP's hash_algos Methode</ulink> gesehen werden. Wenn kein
- Algorithmus spezifiziert wird, wird <code>crc32</code> als Standardalgorithmus verwendet.
- </para>
- <example id="zend.file.transfer.introduction.informations.example2">
- <title>Den Hash einer Datei erhalten</title>
- <programlisting role="php"><![CDATA[
- $upload = new Zend_File_Transfer();
- $upload->receive();
- // Gibt die Hashes von allen Dateien als Array zurück
- // wenn mehr als eine Datei hochgeladen wurde
- $hash = $upload->getHash('md5');
- // Gibt den Has für das 'foo' Formularelement zurück
- $names = $upload->getHash('crc32', 'foo');
- ]]></programlisting>
- </example>
- <note>
- <para>
- Es ist zu beachten das der zurückgegebene Wert ein Array ist, wenn die Datei oder der
- Formularname mehr als eine Datei enthält.
- </para>
- </note>
- <para>
- <code>getMimeType()</code> gibt den Mimetyp einer Datei zurück. Wenn mehr als eine Datei hochgeladen
- wurde wird ein Array zurückgegeben, andernfalls ein String.
- </para>
- <example id="zend.file.transfer.introduction.informations.getmimetype">
- <title>Den Mimetyp einer Datei bekommen</title>
- <programlisting role="php"><![CDATA[
- $upload = new Zend_File_Transfer();
- $upload->receive();
- $mime = $upload->getMimeType();
- // Gibt den Mimetyp des 'foo' Form Elements zurück
- $names = $upload->getMimeType('foo');
- ]]></programlisting>
- </example>
- <note>
- <para>
- Beachte das diese Methode die fileinfo Erweiterung verwendet wenn Sie vorhanden ist. Wenn diese
- Erweiterung nicht gefunden werden kann wird die mimemagic Erweiterung verwendet. Wenn keine
- Erweiterung gefunden wird, dann wird der Mimetyp verwendet der vom Dateiserver wärend des
- Hochladens der Datei angegeben wurde.
- </para>
- </note>
- </sect2>
- <sect2 id="zend.file.transfer.introduction.uploadprogress">
- <title>Fortschritt für Datei Uploads</title>
- <para>
- <classname>Zend_File_Transfer</classname> kann den aktuellen Status eines gerade stattfindenden Datei Uploads
- erheben. Um dieses Feature zu verwenden muß man entweder die <code>APC</code> Erweiterung
- verwenden, die mit den meisten standardmäßigen PHP Installationen vorhanden ist, oder die
- <code>uploadprogress</code> Erweiterung. Beide Erweiterungen werden erkannt und automatisch
- verwendet. Um den Fortschritt zu erhalten muß man einige Voraussetzungen erfüllen.
- </para>
- <para>
- Erstens, muß man entweder <code>APC</code> oder <code>uploadprogress</code> aktiviert haben.
- Es ist zu beachten das dieses Feature von <code>APC</code> in der eigenen php.ini ausgeschaltet
- werden kann.
- </para>
- <para>
- Zweitens, muß man die richtigen unsichtbaren Felder im Formular hinzugefügt haben das die Dateien
- sendet. Wenn man <classname>Zend_Form_Element_File</classname> verwendet werden diese unsichtbaren Felder
- automatisch von <classname>Zend_Form</classname> hinzugefügt.
- </para>
- <para>
- Wenn die oberen zwei Punkte vorhanden sind dann ist man in der Lage den aktuellen Fortschritt des
- Datei uploads zu erhalten indem man die <code>getProgress</code> Methode verwendet. Aktuell gibt
- es 2 offizielle Wege um das hand zu haben.
- </para>
- <sect3 id="zend.file.transfer.introduction.uploadprogress.progressadapter">
- <title>Verwenden eines Progressbar Adapters</title>
- <para>
- Man kann einen bequemen <emphasis>Zend_ProgressBar</emphasis> verwenden um den aktuellen
- Fortschritt zu erhalten und kann Ihn dann auf einfachem Wege dem Benutzer zeigen.
- </para>
- <para>
- Um das zu ermöglichen, muß man den gewünschten <emphasis>Zend_ProgressBar_Adapter</emphasis>
- bei <code>getProgress()</code> hinzufügen wenn es das erste Mal aufgerufen wird. Für Details
- über den zu verwendenden Adapter, bitte im Kapitel
- <link linkend="zend.progressbar.adapters">Zend_ProgressBar Standard Adapters</link> nachsehen.
- </para>
- <example id="zend.file.transfer.introduction.uploadprogress.progressadapter.example1">
- <title>Verwenden eines Progressbar Adapters um den aktuellen Status zu erhalten</title>
- <programlisting role="php"><![CDATA[
- $adapter = new Zend_ProgressBar_Adapter_Console();
- $upload = Zend_File_Transfer_Adapter_Http::getProgress($adapter);
- $upload = null;
- while (!$upload['done']) {
- $upload = Zend_File_Transfer_Adapter_Http:getProgress($upload);
- }
- ]]></programlisting>
- </example>
- <para>
- Die komplette Handhabung wird von <code>getProgress()</code> im Hintergrund durchgeführt.
- </para>
- </sect3>
- <sect3 id="zend.file.transfer.introduction.uploadprogress.manually">
- <title>getProgress() händisch verwenden</title>
- <para>
- Man kann mit <code>getProgress()</code> auch händisch arbeiten, also ohne ie Verwendung von
- <classname>Zend_ProgressBar</classname>.
- </para>
- <para>
- <code>getProgress()</code> muß ohne Einstellungen aufgerufen werden. Es gibt anschließend ein
- Array mit verschiedenen Schlüssel zurück. Sie unterscheiden sich, abhängig von der verwendeten
- PHP Extension. Aber die folgenden Schlüssel werden unabhängig von der Extension zurück gegeben:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis role="strong">id</emphasis>: Die ID dieses Uploads. Die ID identifiziert den
- Upload in der Extension. Sie wird automatisch geschrieben. Man sollte Sie nie ändern
- oder den Wert selbst setzen.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">total</emphasis>: Die komplette Größe der Datei die hochgeladen
- wird in Bytes als Integer.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">current</emphasis>: Die aktuelle hochgeladene Größe der
- Datei in Bytes als Integer.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">rate</emphasis>: Die durchschnittliche Geschwindigkeit des
- Uploads in Bytes pro Sekunde als Integer.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">done</emphasis>: Gibt true zurück wenn der Upload abgeschlossen
- wurde, andernfalls false.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">message</emphasis>: Die aktuelle Meldung. Entweder der
- Fortschritt als Text in der Form <emphasis role="strong">10kB / 200kB</emphasis>, oder
- eine hilfreiche Nachricht im Fall eines Problems. Probleme könnten sein, das kein
- Upload durchgeführt wird, das ein Fehler wärend des Empfangens der Daten, für den
- Fortschritt, aufgetreten ist, oder das der Upload abgebrochen wurde.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">progress</emphasis>: Dieser optionale Schlüssel nimmt eine
- Instanz von Zend_ProgressBar_Adapter oder Zend_ProgressBar, und erlaubt es, den aktuellen
- Status des Uploads, in einer Progressbar zu erhalten
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">session</emphasis>: Dieser optionale Schlüssel nimmt den Namen
- eines Session Namespaces entgegen der in Zend_ProgressBar verwendet wird. Wenn dieser
- Schlüssel nicht angegeben wird, ist er standardmäßig
- <classname>Zend_File_Transfer_Adapter_Http_ProgressBar</classname>.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Alle anderen zurückgegebenen Schlüssel werden direkt von den Extensions übernommen und werden
- nicht geprüft.
- </para>
- <para>
- Das folgende Beispiel zeigt eine mögliche händische Verwendung:
- </para>
- <example id="zend.file.transfer.introduction.uploadprogress.manually.example1">
- <title>Händische Verwendung des Datei Fortschritts</title>
- <programlisting role="php"><![CDATA[
- $upload = Zend_File_Transfer_Adapter_Http::getProgress();
- while (!$upload['done']) {
- $upload = Zend_File_Transfer_Adapter_Http:getProgress($upload);
- print "\nAktueller Fortschritt:".$upload['message'];
- // Tu was zu tun ist
- }
- ]]></programlisting>
- </example>
- </sect3>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 tw=80 et:
- -->
|