2014-12-30 10 views
10

Ho un requisito per creare 3 file CSV (in memoria) durante una singola richiesta HTTP, ZIP i file in un singolo file compresso e restituire il file compresso come risposta HTTP.PHP Crea più file CSV in memoria, quindi comprimi

Ho il seguente codice per creare il file zip ...

$files = array($file1, $file2); 
$zipname = 'file.zip'; 
$zip = new ZipArchive; 
$zip->open($zipname, ZipArchive::CREATE); 
foreach ($files as $file) { 
    $zip->addFile($file); 
} 
$zip->close(); 

header('Content-Type: application/zip'); 
header('Content-disposition: attachment; filename='.$zipname); 
header('Content-Length: ' . filesize($zipname)); 
readfile($zipname); 

Tuttavia, non so come creare i file CSV nella memoria.

Come posso ottenere questo risultato?

risposta

14

Prova questo ...

// some data to be used in the csv files 
$headers = array('id', 'name', 'age', 'species'); 
$records = array(
    array('1', 'gise', '4', 'cat'), 
    array('2', 'hek2mgl', '36', 'human') 
); 

// create your zip file 
$zipname = 'file.zip'; 
$zip = new ZipArchive; 
$zip->open($zipname, ZipArchive::CREATE); 

// loop to create 3 csv files 
for ($i = 0; $i < 3; $i++) { 

    // create a temporary file 
    $fd = fopen('php://temp/maxmemory:1048576', 'w'); 
    if (false === $fd) { 
     die('Failed to create temporary file'); 
    } 

    // write the data to csv 
    fputcsv($fd, $headers); 
    foreach($records as $record) { 
     fputcsv($fd, $record); 
    } 

    // return to the start of the stream 
    rewind($fd); 

    // add the in-memory file to the archive, giving a name 
    $zip->addFromString('file-'.$i.'.csv', stream_get_contents($fd)); 
    //close the file 
    fclose($fd); 
} 
// close the archive 
$zip->close(); 


header('Content-Type: application/zip'); 
header('Content-disposition: attachment; filename='.$zipname); 
header('Content-Length: ' . filesize($zipname)); 
readfile($zipname); 

// remove the zip archive 
// you could also use the temp file method above for this. 
unlink($zipname); 

Ho appena provato questo sulla mia macchina e funziona benissimo.

Ho usato questo collegamento come riferimento, può essere utile.

MetaShock Reference

+0

Molto utile. Molte grazie. – Cloud

1

È possibile utilizzare di memory wrapper php:

$zipname = 'php://memory'; 

Su sistemi con /dev/shm filesystem è possibile creare file lì, verrà mantenuta solo in memoria e accessibile solo al processo corrente. Non dimenticare di rimuoverli dopo l'invio, il processo del server Web continuerà a essere eseguito.

+0

Sarà questo il supporto di più file? Ad esempio ... $ zipname1 = 'php: // memoria'; $ zipname2 = 'php: // memoria'; $ zipname3 = 'php: // memoria'; – fml

+0

Ogni 'fopen ('php: // memoria', $ mode)' si aprirà separato nel file moemory. Il problema è che non sono nominati, chiudendo il puntatore del file si perde ciò che è stato scritto. Non conosco la libreria 'ZipArchive' per sapere se questo è un problema, probabilmente non dovresti chiamare' $ zip-> close() 'ma qualcos'altro per ottenere lo stream. C'è ancora un'altra soluzione, aggiornerò la mia risposta. – Marek