I have a gallery of files shown in a table with checkboxes for each file. The goal is to check the files you want to download, then click a button to download a zip file containing those individual files.
Everything seems to work okay... the array, the ajax, the "success" response... but the file won't download. Is it possible to download files in this way? If not, what do I need to do differently for this to work properly?
jQuery
// searchIDs returns an array of file names. ie:
// 'file1.zip', 'file2.png', 'file3.pdf'
$('#toolkit-bin input[type=submit]').on('click', function(e) {
e.preventDefault();
$.ajax({
type : 'POST',
url : './functions.php',
data : { searchIDs: searchIDs },
success : function(data) {
alert(data);
},
error : function(request,error) {
alert("Request: "+JSON.stringify(request));
}
});
});
functions.php
// ROOT is defined as the root directory of the server.
$zipname = 'LiveLOUD-Toolkit.zip';
$zip = new ZipArchive();
$zip -> open($zipname, ZipArchive::CREATE | ZipArchive::OVERWRITE);
// Get the array of the selected files.
$files = $_POST['searchIDs'];
// Loop through the files.
foreach ($files as $file)
{
// Get the path to the file.
$path = ROOT.'/_assets/toolkit/'.$file;
// Add the file to the zip.
$zip -> addFromString(basename($path), file_get_contents($path));
}
// Zip archive will be created only after closing object.
$zip -> close();
// If the file was created successfully...
if (file_exists($zipname))
{
// Download the zip file.
// THIS STUFF DOES NOT SEEM TO WORK
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$zipname);
header('Content-Length: '.filesize($zipname));
// Delete the zip after download.
unlink($zipname);
// This is successfully returned.
echo 'Success!';
}
else
{
echo 'Error!';
}