Att det inte fungerar via AJAX kanske beror på att webbläsaren behöver en annan header för att den ska tolka innehållet som just en zip-fil som användaren kan spara på sin dator.
Är inte 100% men misstänker att det är så. Och om det är checkboxar eller liknande saker du skall köra så är det väl ändå en formulär postning med vilka filer som skall in i zip:en? Ser inte riktigt varför man skall uppfinna något webbläsaren gör redan by default.
Jag har länkar till ett antal bilder i ett objekt. Jag hämtar alla dessa bilder från länkarna och lägger i en zip-fil via php. En nedladdning av zip-filen med bilder startar automatiskt. Jag började med denna kod som fungerar bra.
Nedladdningslänk i min vy som leder till min kontroller
<a href="<?php echo URL . 'album/downloadImage/' ?>" id="disableButton" class="download-button"><span class="glyphicon glyphicon-download" aria-hidden="true"></span></span>Download all photos</a>
Min kontroller ser ut såhär
public function downloadImage()
{
$this->model->downloadImage();
}
Såhär ser min model ut. I modellen lägger jag alla bilderna i en zip-fil och startar automatiskt en nedladdning av zip-filen.
public function downloadImage() {
$imageNumber = 1;
$zipName = 'name-'.date("Y-m-d").'.zip';
# create new zip opbject
$zip = new ZipArchive();
# create a temp file & open it
$tmp_file = tempnam('.','');
$zip->open($tmp_file, ZipArchive::CREATE);
# loop through each file
foreach($this->imageUrl as $file){
# Get extension
$ext = pathinfo(parse_url($file->url, PHP_URL_PATH), PATHINFO_EXTENSION);
# download file
$download_file = file_get_contents($file->url);
# add it to the zip
$zip->addFromString(basename($imageNumber.'-name.'.$ext),$download_file);
$imageNumber++;
}
# close zip
$zip->close();
# send the file to the browser as a download
header('Content-type: application/zip');
header('Content-disposition: attachment; filename='.$zipName);
header('Content-Length: ' . filesize($tmp_file));
readfile($tmp_file);
}
Alla denna kod fungerar som sagt bra. Dock vill jag modifiera en html-tag under och efter nedladdningen av zip-filen och vill därför starta den via ett ajax-anrop istället.
Uppdaterade min vy till
<a href="#" id="disableButton" class="download-button"><span class="glyphicon glyphicon-download" aria-hidden="true"></span></span>Download all photos</a>
Som länkar till ett ajax-script i min js-fil som ser ut såhär.
if ($('#disableButton').length !== 0) {
$('#disableButton').on('click', function() {
$.ajax(url + "album/downloadImage")
.done(function(result) {
//done
})
.fail(function() {
// this will be executed if the ajax-call had failed
})
.always(function() {
// this will ALWAYS be executed, regardless if the ajax-call was success or not
});
});
}
All annan kod förutom dessa två ändringarna är densamma. Jag har testat att logga min kontroller och modell funktion och ajax-sciptet går in i båda funktionerna så sökvägen är rätt men ändå startar inte nedladdningen nedladdningen av zipfilen.
För att summera. Nedladdningen av zipfilen fungerar om jag anropar via php från min vy men inte via ajax från min vy. Varför fungerar det inte? Måste jag ändra något i modellen där jag sköter nedladdningen av zip-filen? Får inga felmeddelanden.

