zip aus Blob-Dateien erstellen

Kalito

Erfahrenes Mitglied
Hallo,

ich habe ein Script geschrieben, was aus der DB mehrere BLOB-Dateien liest und diese dann in ein ZIP-Archiv packt. Doch leider habe ich das Problem, das die PDF-Dateien und die Zip selber auf den Server gespeichert werden. Wie kann ich es aber so gestalten, as die Dateien nicht gespeichert werden.

Hier noch die Funktionen
PHP:
public function downloadUserFile($training){       
        $FileModel          =ClassRegistry::init('Registration');
        $TrainingsUserModel =ClassRegistry::init('TrainingsUser');
        $TrainingModel      =ClassRegistry::init('Training'); 
        $UserModel          = ClassRegistry::init('User');
        //Initialisiert ein Array
        $fileArray = array();
        //Alle User die an der Schulung teilnehmen
         $users = $TrainingsUserModel->find('all', array('conditions'=>array('training_id'=>$training, 'angenommen'=>'1'), 'fields'=>'user_id'));
        //Ermittelt Schulungsname
        $trainingName = $TrainingModel->find('first', array('filds'=>'name', array('conditions'=>array('id'=>$training))));
        foreach($users as $user){
            //jeweilige Userdaten
            $userdata = $UserModel->find('first', array('conditions'=>array('User.id'=>$user['TrainingsUser']['user_id'])));
            //holt Blobdatei
            $temp = $FileModel->find('first', array('fields'=>'id' ,'conditions'=>array('user_id'=>$user['TrainingsUser']['user_id'])));
            $file = $FileModel->read(null, $temp['Registration']['id']);     
            
            $filename = $userdata['User']['firstname'].' '.$userdata['User']['lastname'].'.pdf';
            
           $fileArray[] = $filename;
            //generiert die PDF
            file_put_contents($filename, $file['Registration']['file']);            
        }
        $filename = $trainingName['Training']['name'].".zip";
        //generiert ZIP
        $this->makeZip($fileArray, $filename);      
        //Ausgabe der Zip
        header("Content-type: application/zip");
        header("Content-Disposition: attachment; filename=$filename");
        header("Pragma: no-cache");
        header("Expires: 0");
        readfile("$filename");
    }
    
    private function makeZip($fileArray, $filename){
        $zip = new ZipArchive();
        
        $zip->open($filename, ZIPARCHIVE::CREATE);
        foreach($fileArray as $file){
            $zip->addFile($file);
        }
        return $zip->close();
    }

Gruß, Kalito
 
ZipArchive biete die Möglichkeit, Daten aus einem String zu lesen: http://www.php.net/manual/de/function.ziparchive-addfromstring.php

Ungefähr so:

PHP:
<?php
class test
{
	public function downloadUserFile($training){
		$FileModel          =ClassRegistry::init('Registration');
		$TrainingsUserModel =ClassRegistry::init('TrainingsUser');
		$TrainingModel      =ClassRegistry::init('Training');
		$UserModel          = ClassRegistry::init('User');
		//Initialisiert ein Array
		$fileArray = array();
		//Alle User die an der Schulung teilnehmen
		$users = $TrainingsUserModel->find('all', array('conditions'=>array('training_id'=>$training, 'angenommen'=>'1'), 'fields'=>'user_id'));
		//Ermittelt Schulungsname
		$trainingName = $TrainingModel->find('first', array('filds'=>'name', array('conditions'=>array('id'=>$training))));
		
		$zipFileName = $trainingName['Training']['name'].".zip";
		
		// Zip object
		$zip = new ZipArchive();
		// Open + create
		$zip->open($zipFileName, ZIPARCHIVE::CREATE);
		foreach($users as $user){
			//jeweilige Userdaten
			$userdata = $UserModel->find('first', array('conditions'=>array('User.id'=>$user['TrainingsUser']['user_id'])));
			//holt Blobdatei
			$temp = $FileModel->find('first', array('fields'=>'id' ,'conditions'=>array('user_id'=>$user['TrainingsUser']['user_id'])));
			$file = $FileModel->read(null, $temp['Registration']['id']);

			$filename = $userdata['User']['firstname'].' '.$userdata['User']['lastname'].'.pdf';
			// Add pdf direct from database into zip without saving to seperate file
			$zip->addFromString($filename, $file['Registration']['file']);
		}
		// Close and save
		$zip->close();
		
		//Ausgabe der Zip
		header("Content-type: application/zip");
		header("Content-Disposition: attachment; filename=$zipFileName");
		header("Pragma: no-cache");
		header("Expires: 0");
		readfile($zipFileName);
		// Remove the zip after sending?
		unlink($zipFileName);
	}
}

Ach übrigens, kann es sein, das dir in der Zeile

PHP:
		//Ermittelt Schulungsname
		$trainingName = $TrainingModel->find('first', array('filds'=>'name', array('conditions'=>array('id'=>$training))));

ein Fehler unterlaufen ist? Müsste es nicht array('fields'=>'name' heißen?
 
Zurück