Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Manipulate an Archive in memory with PHP (without creating a temporary file on disk)

I am trying to generate an archive on-the-fly in PHP and send it to the user immediately (without saving it). I figured that there would be no need to create a file on disk as the data I'm sending isn't persistent anyway, however, upon searching the web, I couldn't find out how. I also don't care about the file format.

So, the question is:

Is it possible to create and manipulate a file archive in memory within a php script without creating a tempfile along the way?

like image 786
ralokt Avatar asked Jul 27 '09 16:07

ralokt


1 Answers

I had the same problem but finally found a somewhat obscure solution and decided to share it here.

I came accross the great zip.lib.php/unzip.lib.php scripts which come with phpmyadmin and are located in the "libraries" directory.

Using zip.lib.php worked as a charm for me:

require_once(LIBS_DIR . 'zip.lib.php');  ...   //create the zip $zip = new zipfile();  //add files to the zip, passing file contents, not actual files $zip->addFile($file_content, $file_name);  ...  //prepare the proper content type header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=my_archive.zip"); header("Content-Description: Files of an applicant");  //get the zip content and send it back to the browser echo $zip->file(); 

This script allows downloading of a zip, without the need of having the files as real files or saving the zip itself as a file.

It is a shame that this functionality is not part of a more generic PHP library.

Here is a link to the zip.lib.php file from the phpmyadmin source: https://github.com/phpmyadmin/phpmyadmin/blob/RELEASE_4_5_5_1/libraries/zip.lib.php

UPDATE: Make sure you remove the following check from the beginning of zip.lib.php as otherwise the script just terminates:

if (! defined('PHPMYADMIN')) {     exit; } 

UPDATE: This code is available on the CodeIgniter project as well: https://github.com/patricksavalle/CodeIgniter/blob/439ac3a87a448ae6c2cbae0890c9f672efcae32d/system/helpers/zip_helper.php

like image 186
nettle Avatar answered Sep 22 '22 03:09

nettle