Search code examples
phpzip

Zip files in a directory use part of URL as file name


I use a php file to created zip archive of all jpg files in a folder and make it available for download.

Here is the script:

<?php
$zip = new ZipArchive;
$download = 'FileName.zip';
$zip->open($download, ZipArchive::CREATE);
foreach (glob("*.jpg") as $file) { /* Add appropriate path to read content of zip */
    $zip->addFile($file);
}
$zip->close();
header('Content-Type: application/zip');
header("Content-Disposition: attachment; filename = $download");
header('Content-Length: ' . filesize($download));
header("Location: $download");
?>

I was wondering if it is possible to use part of url as archive name? My URLS look like this:

https://www.example.com/data/pictures/album/

I want the archive name to be Pictures-Album-CustomText.zip


Solution

  • You have a couple of options:

    Option 1: Using a combination of $_SERVER['PHP_SELF'], substr(), and str_replace().

    Option 2: Using a combination of $_SERVER['PHP_SELF'], rtrim(), explode(), and count().

    1st option, broken down:


    $url = $_SERVER['PHP_SELF'];              // the current full url
    strrpos($url, "pictures/")                // finds "pictures/" in the $url variable
    substr($url, strrpos($url, "pictures/"))  // extracts everything from "pictures/" onwards
    str_replace("/","-", $name_pre);          // replaces "/" with "-" 
    

    <?php
    
        $url = $_SERVER['PHP_SELF'];
        $name_pre = substr($url, strrpos($url, "pictures/"));
        $name_pre = str_replace("/","-", $name_pre);
        $zip = new ZipArchive;
        $download = $name_pre . 'FileName.zip';
        $zip->open($download, ZipArchive::CREATE);
        foreach (glob("*.jpg") as $file) { 
           $zip->addFile($file);
        }
        $zip->close();
        header('Content-Type: application/zip');
        header("Content-Disposition: attachment; filename = $download");
        header('Content-Length: ' . filesize($download));
        header("Location: $download");
    ?>
    

    2nd option, broken down:

    $url = rtrim($_SERVER['PHP_SELF'], "/"); // get url and remove trailing "/"
    $url_pieces = explode('/', $url);        // break string into pieces based on "/"
    $url_pieces_count = count($url_pieces);  // count the number of pieces
    $name_pre = $url_pieces[($url_pieces_count - 2)] . "-" . $url_pieces[($url_pieces_count - 1)] . "-"; // construct the filename preface
    

    <?php
    
        $url = rtrim("https://www.example.com/data/pictures/album/", "/");
        $url_pieces = explode('/', $url);
        $url_pieces_count = count($url_pieces);
        $name_pre = $url_pieces[($url_pieces_count - 2)] . "-" . $url_pieces[($url_pieces_count - 1)] . "-";
        $zip = new ZipArchive;
        $download = $name_pre . 'FileName.zip';
        $zip->open($download, ZipArchive::CREATE);
        foreach (glob("*.jpg") as $file) { 
           $zip->addFile($file);
        }
        $zip->close();
        header('Content-Type: application/zip');
        header("Content-Disposition: attachment; filename = $download");
        header('Content-Length: ' . filesize($download));
        header("Location: $download");
    ?>