webForumDet fria alternativet

zip nedladdning i funktion fungerar om jag anropar via php men inte via ajax

PHP

2 svar · 1 308 visningar · startad av xtreme

Medlem sedan juli 20002 056 inlägg
Frågan#1

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.

Medlem sedan juni 20031 837 inlägg
#2

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.

Medlem sedan juni 20019 519 inlägg
#3

Varför köra AJAX? du vill väl ändå köra nerladdning av filen? JS koden känns rätt överflödig.

253 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)