Programmer's Reference Guide

Zend_File

Zend_File_Transfer

Zend_File_Transfer 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 Zend_File_Transfer die selbe API für Transportprotokolle wie HTTP, FTP, WEBDAV und andere zu verwenden.

Hinweis: Einschränkungen
Die aktuelle Implementation von Zend_File_Transfer die in 1.6.0 ausgeliefert wird, ist auf HTTP Post Uploads limitiert. Andere Adapter die Downloads und andere Protokolle unterstützen werden in zukünftigen Releases hinzugefügt. Aktuell sollte Zend_File_Transfer_Adapter_Http direkt verwendet werden. Sobald andere Adapter vorhanden sind, kann ein gemeinsames Interface verwendet werden.

Hinweis: Formulare
Wenn man Zend_Form verwendet sollte man die APIs die von Zend_Form zur Verfügung gestellt werden, und Zend_File_Transfer nicht direkt, verwenden. Der Dateitransfer Support von Zend_Form ist in Zend_File_Transfer implementiert, weshalb die Informationen in diesem Kapitel für fortgeschrittene Benutzer von Zend_Form interessant sind.

Die Verwendung von Zend_File_Transfer ist relativ einfach. Es besteht aus zwei Teilen. Dem HTTP Formular, wärend Zend_File_Transfer die hochgeladenen Dateien behandelt. Siehe das folgende Beispiel:

Beispiel #1 Einfaches Formular für File-Uploads

Dieses Beispiel zeigt einen einfachen Dateiupload. Das erste Teil ist das Dateiformular. In unserem Beispiel gibt es nur eine Datei welche wir hochladen wollen.

<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>

        

Der Bequemlichkeit halber kann Zend_Form_Element_File verwendet werden statt das HTML manuell zu erstellen.

Der nächste Schritt ist die Erstellung des Empfängers des Uploads. In unserem Beispiel ist der Empfänger bei /file/upload zu finden. Als nächstes erstellen wir also den file Controller mit der upload Aktion.

$adapter = new Zend_File_Transfer_Adapter_Http();

$adapter->setDestination('C:\temp');

if (!$adapter->receive()) {
    $messages = $adapter->getMessages();
    echo implode("\n", $messages);
}

        

Dieses Codebeispiel demonstriert die einfachste Verwendung von Zend_File_Transfer. Ein lokales Ziel wird mit der setDestination Methode definiert, und anschließend die receive() Methode aufgerufen. Wenn irgendwelche Uploadfehler auftreten werden diese als Ausnahme zurückgegeben.

Hinweis: Achtung
Dieses Beispiel ist nur für die Demonstration der grundsätzlichen API von Zend_File_Transfer. Man sollte dieses Code Beispiel niemals in einer Produktivumgebung einsetzen da es massive Sicherheitslücken aufweisst. Man sollte immer Prüfungen verwenden um die Sicherheit zu erhöhen.

Von Zend_File_Transfer unterstützte Adapter

Zend_File_Transfer wurde designt um verschiedenste Adapter und auch Richtungen zu unterstützen. Mit Zend_File_Transfer kann man Dateien Hochladen, Herunterladen und sogar Weiterleiten (Hochladen mit einem Adapter und Herunterladen mit einem anderen Adapter zur gleichen Zeit).

Optionen für Zend_File_Transfer

Zend_File_Transfer und seine Adapter unterstützen verschiedene Optionen. Alle Optionen können gesetzt werden indem Sie entweder dem Constructor übergeben werden, oder durch Aufruf der setOptions($options). getOptions() gibt die Optionen zurück die aktuell gesetzt sind. Nachfolgend ist eine Liste aller unterstützten Optionen:

  • ignoreNoFile: 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.

Dateien prüfen

Zend_File_Transfer 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:

  • isValid($files = null): 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 isValid() aufrufen bevor receive() aufgerufen wird; in diesem Fall ruft receive() intern isValid() nicht mehr auf.

  • isUploaded($files = null): 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.

  • isReceived($files = null): Diese Methode prüft ob die spezifizierte Datei bereits empfangen wurde. Wenn keine Dateien angegeben wurden, werden alle Dateien geprüft.

Beispiel #2 Dateien prüfen

$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();

            

Zusätzliche Dateiinformationen

Zend_File_Transfer kann zusätzliche Informationen über Dateien zurückgeben. Die folgenden Methoden sind vorhanden:

  • getFileName($file = null, $path = true): Diese Methode gibt den wirklichen Namen der übertragenen Datei zurück.

  • getFileInfo($file = null): Diese Methode gibt die internen Informationen für die angegebene übertragene Datei zurück.

  • getFileSize($file = null): Diese Methode gibt die echte dateigröße für die angegebene Datei zurück.

  • getHash($hash = 'crc32', $files = null): Diese Methode gibt einen Hash des Inhalts einer angegebenen übertragenen Datei zurück.

getFileName() 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.

Standardmäßig werden Dateinamen mit dem kompletten Pfad zurückgegeben. Wenn man nur den Dateinamen ohne Pfad benötigt, kann der zweite Parameter $path gesetzt werden, welcher den Dateinamen ausschneidet wenn er auf false gesetzt wird.

Beispiel #3 Den Dateinamen bekommen

$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');

            

Hinweis: 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 getFileName() immer ausführen nachdem die Dateien empfangen wurden.

getFileSize() gibt standardmäßig die echte Dateigröße in SI Schreibweise zurück was bedeutet das man 2kB statt 2048 erhält. Wenn man die reine Größe benötigt muß man die useByteString Option auf false setzen.

Beispiel #4 Die Größe einer Datei erhalten

$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();

            

getHash() akzeptiert den Namen eines Hash Algorithmus als ersten Parameter. Für eine Liste bekannter Algorithmen kann in » PHP's hash_algos Methode gesehen werden. Wenn kein Algorithmus spezifiziert wird, wird crc32 als Standardalgorithmus verwendet.

Beispiel #5 Den Hash einer Datei erhalten

$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');

            

Hinweis: Es ist zu beachten das der zurückgegebene Wert ein Array ist, wenn die Datei oder der Formularname mehr als eine Datei enthält.


Zend_File
blog comments powered by Disqus

Select a Version

Languages Available

Components

Search the Manual