Zip-Erstellung und Download in Drupal7

Bild des Benutzers tobiasb

Ich habe heute für die Verwaltung bzw. unserem Webservice von RoboTagger.com eine Zip-Generierung und Download erstellt.

Welches ich natürlich nicht der Drupal-Gemeinde vorenthalten will, vielleicht hilft es dem einen oder anderen.

Wir gehen davon aus, es ist bereits ein Menüpfad via hook_menu registriert, welches die Funktion aufruft etc. Der Code ist natürlich so nicht fertig, sondern soll nur als Grundbaustein dienen.

Die benutze Klasse ZipArchive ist erst ab >= php 5.2 vorhanden. (http://de.php.net/manual/en/class.ziparchive.php)

Mit der Methode addEmptyDir() definieren wir eigentlich nur Ordner im Archiv, in der wir dann Dateien reinpacken.
In diesem Beispiel wird eine Datei von der Klasse selbst im Archiv angelegt und zwar mit der Methode addFromString(), welches nur den Dateiname und Inhalt also Parameter benötigt.
Sollte die Datei innerhalb eines Ordners angelegt werden, setzen wir den Ordnername einfach vor dem Dateiname. Beispiel : Unterordner/bar.txt.

Ebenfalls können wir bestehende Dateien mit der Methode addFile(), die sich bespielsweise im files-Ordner befinden dem Archiv, hinzufügen.

Zum Schluß wird via file_transfer(); die Datei an den Browser übermittelt. Wichtig war hier das Schema (Streamwrapper), welches ja Neu in Drupal7 ist.

Das wars eigentlich auch schon. Viel Spaß.

Grundbaustein:

  1. function _mymodule_zipdownload() {
  2.   $zipfile = file_directory_temp() . '/export.zip';
  3.   $zip = new ZipArchive();
  4.   $res = $zip->open($zipfile, ZIPARCHIVE::OVERWRITE);
  5.   if ($res !== TRUE) {
  6.     drupal_set_message('Zipfile konnte nicht erstellt werden.', 'error'); // t()-Funktion verwenden, wenn es auch nicht Deutsch verstehende Menschen verstanden werden sollte ;-)
  7.     return '';
  8.   }
  9.   $zip->addEmptyDir('Unterordner');
  10.   $contents = array('Unterordner/bar.txt' => 'Text aus der Datenbank oder so.');
  11.   foreach ($contents as $filename => $content) {
  12.     $zip->addFromString($filename, $content);
  13.   }
  14.   $bestehendedatei = '/bar/foo.txt');
  15.   $files = array('fooneu.txt' => $bestehendedatei);
  16.   foreach ($files as $filename => $file) {
  17.     $zip->addFile($file, $filename);
  18.   }
  19.   $zip->close();
  20.   // die funktion braucht ein schema
  21.   file_transfer('temporary://' . basename($zipfile), array('Content-type' => 'application/zip', 'Content-Disposition' => "attachment; filename=export.zip", 'cache-control' => 'must-revalidate'));
  22.   }

Re: Zip-Erstellung und Download in Drupal7

Kleiner Fuscher - t() :D

Bild des Benutzers tobiasb

Re: Zip-Erstellung und Download in Drupal7

Habe mal ein Kommentar im Code hinzugefügt ;-)