PHP Create Multiple CSV Files in Memory then Compress

后端 未结 2 1637
南旧
南旧 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

    0 讨论(0)
  • 2020-12-30 09:14

    You can use php's memory wrapper:

    $zipname = 'php://memory';
    

    On systems having /dev/shm filesystem you can create files there, they will be kept only in memory and only accessible to current process. Don't forget to remove them after sending, web server process will keep running.

    0 讨论(0)
提交回复
热议问题