PHP Create Multiple CSV Files in Memory then Compress

后端 未结 2 1638
南旧
南旧 2020-12-30 08:30

I have a requirement to create 3 CSV files (in memory) during a single HTTP request, ZIP the files into a single compressed file and return the compressed file as a HTTP res

2条回答
  •  北海茫月
    2020-12-30 09:01

    Try this...

    // 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);
    

    I've just tested this on my machine and it works fine.

    I used this link as a reference, It may be useful.

    MetaShock Reference

提交回复
热议问题