Download multiple files as a zip-file using php
Asked Answered
C

5

133

How can I download multiple files as a zip-file using php?

Christabelle answered 18/11, 2009 at 8:6 Comment(1)
You can use the xip.lib.php Class lib. zip.lib.php For examples, refer to this articleHepza
C
253

You can use the ZipArchive class to create a ZIP file and stream it to the client. Something like:

$files = array('readme.txt', 'test.html', 'image.gif');
$zipname = 'file.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach ($files as $file) {
  $zip->addFile($file);
}
$zip->close();

and to stream it:

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

The second line forces the browser to present a download box to the user and prompts the name filename.zip. The third line is optional but certain (mainly older) browsers have issues in certain cases without the content size being specified.

Cento answered 18/11, 2009 at 8:8 Comment(13)
Shouldn't it be $zip = new ZipArchive; instead of $zip = new ZipFile; ?Sturdy
@Sturdy The parentheses are not necessary. Look in examples: php.net/manual/en/ziparchive.open.phpCummerbund
What is the variable $zipfilename supposed to mean?Carpio
$zipfilename should read $zipname - it's the filename of the created zip as a string.Neogaea
Its not working in windows default zip opener however working in win zipper or 7-zip. I'm trying to add image in zip folder and then download as zipMisogyny
Above header is not working in windows native zip opener. It says invalid zip, however perfect in ubuntu.Misogyny
this answer is not too good because people often zip archives that are not in the same directory as running script. use readfile($zippath) and filesize($zippath) instead of "zipname'Squamous
While this works, I have the CPU maxing out at 100% during addFile() process.Riddell
I tried this but when I tried to unzip the zip-file it says that the archieve is not readable and the archieve may not be valid or its table of content could be encrypted. What's wrong?Surbeck
Using this example, my archive file is 0 bytes. But changing one line, as shown in the example by @SunLove, the archive works: change $zip->addFile($file); to $zip->addFromString(basename($path), file_get_contents($path));Octo
I had to vary the name of the .zip file or else my browser repeatedly downloaded the exact same content, even though the list of files being archived by my script had changed. Seems like the file was cached. By including the time() in the filename, as shown in @SunLove's example, it worked.Octo
adding files this way : $zip->addFromString(basename($file), file_get_contents($file)); works for me.Ma
Use $zip->addFile($file,basename($file)); if you want to remove the paths. #3993605Nf
I
47

This is a working example of making ZIPs in PHP:

$zip = new ZipArchive();
$zip_name = time().".zip"; // Zip name
$zip->open($zip_name,  ZipArchive::CREATE);
foreach ($files as $file) {
  echo $path = "uploadpdf/".$file;
  if(file_exists($path)){
  $zip->addFromString(basename($path),  file_get_contents($path));  
  }
  else{
   echo"file does not exist";
  }
}
$zip->close();
Impale answered 10/5, 2013 at 10:58 Comment(1)
This answer works! Difference is addFromString, addFile is badly coded.Fullblown
S
1

Create a zip file, then download the file, by setting the header, read the zip contents and output the file.

http://www.php.net/manual/en/function.ziparchive-addfile.php

http://php.net/manual/en/function.header.php

Skive answered 18/11, 2009 at 8:9 Comment(0)
G
1

You are ready to do with php zip lib, and can use zend zip lib too,

<?PHP
// create object
$zip = new ZipArchive();   

// open archive 
if ($zip->open('app-0.09.zip') !== TRUE) {
    die ("Could not open archive");
}

// get number of files in archive
$numFiles = $zip->numFiles;

// iterate over file list
// print details of each file
for ($x=0; $x<$numFiles; $x++) {
    $file = $zip->statIndex($x);
    printf("%s (%d bytes)", $file['name'], $file['size']);
    print "
";    
}

// close archive
$zip->close();
?>

http://devzone.zend.com/985/dynamically-creating-compressed-zip-archives-with-php/

and there is also php pear lib for this http://www.php.net/manual/en/class.ziparchive.php

Gendarmerie answered 6/9, 2013 at 13:50 Comment(0)
T
0

I open that zip file occur this popup An error occurred while loading the archive. give solution MY code

if (isset($_POST['selectedFiles'])) {
            // Handle form submission
            $selectedFiles = $_POST['selectedFiles'];
            $zip = new ZipArchive();
            $error = "";
            $zipname = 'selected_files.zip';
            $zip->open($zipname, ZipArchive::CREATE);
            foreach ($selectedFiles as $fileName) {
                $filePath = realpath('..').'/QUERY_FILE/'. $fileName;
                if (file_exists($filePath)) {
                    $added = $zip->addFile($filePath, $fileName);
                    if (!$added) {
                        $error .= "* Failed to add file to ZIP: $fileName\n";
                    }
                } else {
                    $error .= "* File not found: $fileName\n";
                }
            }
            $zip->close();
            if (file_exists($zipname)) {
                // Download the zip file
                header('Content-Type: application/zip');
                header('Content-disposition: attachment; filename='.$zipname);
                header('Content-Length: ' . filesize($zipname));
                readfile($zipname);
                // Delete the zip file after download
                // unlink($zipname);
            }   
            if (!empty($error)) {
                echo "Errors occurred while creating the ZIP file:<br>" . $error;
            }
        } else {
            echo 'No files selected';
        }
Transgress answered 20/4 at 5:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.