How to create a download link for a zip file in php?

Make sure that the path inside $archive_file_name is correct and does exist. In your code, you updated the $archive_file_name variable by putting an undeclared prefix variable - $name.

$archive_file_name = $name.'iMUST_Products.zip';

If the path is not correct and cannot be found, the created zipped file have nowhere to go to and the two files have nowhere to store to to begin with. The path to the files to be stored should also exist.

Let's assume that you just want to customize the name of the zipped folder to be downloaded that is why there is a $name variable to prevent redundant file name. But you have to consider the URI where you run your script.

For example, you're using URI routing, and you load the script at https://sample.co/file-management/download-zipped-111. With your current script, the zipped folder will be stored at file-management folder. If it does not exist, you will mostly encounter the error you are experiencing right now.

The solution is to explicitly declare the path to the folder where the zipped file will be stored.

For example, you want to store the zipped file at Harshal/files/zipped/. Make sure that this folder exist by creating a folder named zipped inside files folder and that you have access to write on this folder.

$file_names = array('iMUST Operating Manual V1.3a.pdf', 'iMUST Product Information Sheet.pdf');

// $name should be declared before this line
$archive_file_name = $name.'iMUST_Products.zip';

//Download Files path
$file_path = $_SERVER['DOCUMENT_ROOT'].'/Harshal/files/';

zipFilesAndDownload($file_names, $archive_file_name, $file_path);

function zipFilesAndDownload($file_names, $archive_file_name, $file_path)
{

    $zip = new ZipArchive();
    // WE REUSED THE $file_path VARIABLE HERE THEN ADDED zipped FOLDER
    if ($zip->open($file_path.'zipped/'.$archive_file_name, ZIPARCHIVE::CREATE )!==TRUE) {
        exit('cannot open <'.$archive_file_name.'>');
    }
    //add each files of $file_name array to archive
    foreach($file_names as $files)
    {
        $zip->addFile($file_path.$files, $files);
    }
    $zip->close();
    //then send the headers to force download the zip file
    header("Content-type: application/zip"); 
    header("Content-Disposition: attachment; filename=$archive_file_name"); 
    header('Content-length: '.filesize($file_path.'zipped/'.$archive_file_name));
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    readfile("$archive_file_name");
    exit;
}

People may suggest - "Why not directly put the full path to the $archive_file_name variable?

$archive_file_name = $file_path.'zipped/'.$name.'iMUST_Products.zip';

If we put it directly to $archive_file_name variable, the file that will be downloaded will mostly likely be named /var/www/Harshal/files/zipped/xxx-iMUST_Products.zip.

PHP provides ZipArchive Class which allows us to create a Zip file. This class makes file creation easier.

Programmatically Zip creation is mainly required when preparing the group of files and folders for downloading.

In the example, I am creating a function that will read all files and folders from the specified directory and add them to the ZipArchive class object.

How to create a download link for a zip file in php?


Contents

  1. HTML
  2. PHP
  3. CSS
  4. Demo
  5. Conclusion

1. HTML

Creating a <form> which have two button elements, one for Create Zip and another for Download.

Completed Code

<div class='container'>
   <h2>Create and Download Zip file using PHP</h2>
   <form method='post' action=''>
       <input type='submit' name='create' value='Create Zip' />&nbsp;
       <input type='submit' name='download' value='Download' />
   </form>
</div>

I have created includes folder within the project where I stored some files and folders.

Create Zip

Create ZipArchive Class object for Zip file creation. Define a function createZip() to read files and directory from the specified directory path.

If file

If the reading value is the file then add it to zip object using addFile() method.

If directory

If the value is a directory then create an empty directory and call createZip() function where pass the directory path.

Download Zip

Check if the zip file exists or not. If it exists then download and remove it from the server.

Completed Code

<?php 
// Create ZIP file
if(isset($_POST['create'])){
  $zip = new ZipArchive();
  $filename = "./myzipfile.zip";

  if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {
    exit("cannot open <$filename>\n");
  }

  $dir = 'includes/';

  // Create zip
  createZip($zip,$dir);

  $zip->close();
}

// Create zip
function createZip($zip,$dir){
  if (is_dir($dir)){

    if ($dh = opendir($dir)){
       while (($file = readdir($dh)) !== false){
 
         // If file
         if (is_file($dir.$file)) {
            if($file != '' && $file != '.' && $file != '..'){
 
               $zip->addFile($dir.$file);
            }
         }else{
            // If directory
            if(is_dir($dir.$file) ){

              if($file != '' && $file != '.' && $file != '..'){

                // Add empty directory
                $zip->addEmptyDir($dir.$file);

                $folder = $dir.$file.'/';
 
                // Read data of the folder
                createZip($zip,$folder);
              }
            }
 
         }
 
       }
       closedir($dh);
     }
  }
}

// Download Created Zip file
if(isset($_POST['download'])){
 
  $filename = "myzipfile.zip";

  if (file_exists($filename)) {
     header('Content-Type: application/zip');
     header('Content-Disposition: attachment; filename="'.basename($filename).'"');
     header('Content-Length: ' . filesize($filename));

     flush();
     readfile($filename);
     // delete file
     unlink($filename);
 
   }
}
?>

3. CSS

.container{
   margin: 0 auto;
   width: 50%;
   text-align: center;
}

input[type=submit]{
   border: 0px;
   padding: 7px 15px;
   font-size: 16px;
   background-color: #00a1a1;
   color: white;
   font-weight: bold;
}

4. Demo

View Demo


5. Conclusion

The above-defined function createZip() accepts the path of the directory as a parameter. It will read all files and folders from the path and add them to the zip file.

You can also use ZipArchive Class to unzip the Zip file.

If you found this tutorial helpful then don't forget to share.

To create a zip file in Windows:.
Select the files you want to add to the zip file. Selecting files..
Right-click one of the files. A menu will appear. ... .
In the menu, click Send to and select Compressed (zipped) folder. Creating a zip file..
A zip file will appear. If you want, you can type a new name for the zip file..
How to convert ZIP to HTML.
Open free ZIP website and choose Convert application..
Click inside the file drop area to upload ZIP files or drag & drop ZIP files..
You can upload maximum 10 files for the operation..
Click on Convert button. ... .
Download link of result files will be available instantly after conversion..

How can I download zip file from URL in PHP?

To Download And Extract Zip File It Takes Only One Step:- $url = "http://anysite.com/file.zip"; $zip_file = "folder/downloadfile.

How do I zip a whole directory and download using PHP?

php $files = array($listfiles); $zipname = 'adcs. 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='adcs.