I've checked a few questions before posting, including the following:
While testing on a local server everything worked as intended, however when we uploaded to the live site the downloaded zip files opened as .cpgz
files.
We're populating a SELECT menu (named "Conference") in an html form with the folder names in our "Conferences
" directory (i.e. Asset_Management).
The PHP concatenates into a link as such:
<a href="zip_folders.php?directtozip=' . $_POST["Conference"] . '">Download All As Zip</a>
Our zipping code sets up the zip file:
<?php
// WARNING
// This code should NOT be used as is. It is vulnerable to path traversal. https://www.owasp.org/index.php/Path_Traversal
// You should sanitize $_GET['directtozip']
// For tips to get started see https://stackoverflow.com/questions/4205141/preventing-directory-traversal-in-php-but-allowing-paths
//Get the directory to zip
$filename_no_ext= $_GET['directtozip'];
// we deliver a zip file
header("Content-Type: archive/zip");
// filename for the browser to save the zip file
header("Content-Disposition: attachment; filename=$filename_no_ext".".zip");
// get a tmp name for the .zip
$tmp_zip = tempnam ("tmp", "tempname") . ".zip";
//change directory so the zip file doesnt have a tree structure in it.
chdir('user_uploads/'.$_GET['directtozip']);
// zip the stuff (dir and all in there) into the tmp_zip file
exec('zip '.$tmp_zip.' *');
// calc the length of the zip. it is needed for the progress bar of the browser
$filesize = filesize($tmp_zip);
header("Content-Length: $filesize");
// deliver the zip file
$fp = fopen("$tmp_zip","r");
echo fpassthru($fp);
// clean up the tmp zip file
unlink($tmp_zip);
?>
But when I unzip the file it becomes a .cpgz
file.
Why might this work on our local server and not our remotely hosted site?
EDIT: I think the exec()
command might not be portable, but I'm not sure how to replace that.