2013-02-09 19 views
6

Sto ottenendo il file zip scaricato dal seguente codice senza errori, ma il file zip scaricato è vuoto o danneggiato e la dimensione è sempre di circa 200 byte. Ad esempio, non riesco ad aprire il file zip. Anche ZipArchive :: getStatusString() è anche mostrando "Nessun errore"Ottenere zip danneggiati o vuoti tramite ZipArchive php

codice

è:

public function getzip(){ 
    global $config; 
    $files=array(); 
    if(isset($_COOKIE['hashes'])){ 
     $hashes=explode(',',$_COOKIE['hashes']); 
     for ($i=0; $i <count($hashes); $i++) { 
      array_push($files,$config["domain"]."/download/".$hashes[$i]); 
     } 
    } 
    if(count($files)){ 
     $zipname='basket.zip'; 
     $zip = new ZipArchive; 
     $zip->open($zipname,ZipArchive::CREATE); 
     foreach ($files as $key=>$value) { 
      $zip->addFile($value); 
     } 
     $status=$zip->getStatusString(); 
     $zip->close(); 

    if(!$zipname) 
    { 
     echo "Nothing in Basket"; 
    } 
    else 
    { header('Content-Description: File Transfer'); 
     header('Content-Type: application/zip'); 
     header('Content-Disposition:attachment; filename='.basename($zipname)); 
     header('Content-Length:'.filesize($zipname)); 
     readfile($zipname); 
    } 
} 
+0

il suo dandomi falso. questo significa che la directory $ zipname non è stata creata. Ma non ricevo il messaggio di "Nothing in Basket" invece di scaricare un file zip. –

risposta

3

Questa è la mia ipotesi migliore. Quello che non va è che nell'array $files i valori che stai memorizzando non sono probabilmente veri e propri percorsi dei file.

Ricordare: non è possibile passare URL in $zip->addfile(), è necessario i file effettivi.

5

provare a ottenere il percorso del file e il nome completo poco prima $zip->close();

$filename = $zip->filename; 

e l'uso che invece di $zipname durante la lettura del file e la dimensione del file

+0

@Pony Controlla anche questo .. Continua a ottenere lo stesso problema. Penso che la directory per il file non sia stata creata. Inoltre ho controllato che 'var_dump ($ nomefile)' mostra il percorso esatto. –

+0

Hai assegnato questa variabile prima di chiamare '$ zip-> close()'? –

+0

Ha funzionato come un fascino! Grazie :) – Scott

0

Anche dura a questa domanda è stato capito, mi post quello che ho scoperto come cerniere danneggiato può essere creato:

Quando si effettua archivio zip ti capiterà spesso di eseguire il debug con eco/comandi print_r. Se non li cancelli, il file zip di output sarà corrotto.

Esempio basata sulla domanda:

public function getzip(){ 
    global $config; 
    $files=array(); 
    if(isset($_COOKIE['hashes'])){ 
     $hashes=explode(',',$_COOKIE['hashes']); 
     for ($i=0; $i <count($hashes); $i++) { 
      array_push($files,$config["domain"]."/download/".$hashes[$i]); 
     } 
    } 
    if(count($files)){ 
     $zipname='basket.zip'; 
     $zip = new ZipArchive; 
     $zip->open($zipname,ZipArchive::CREATE); 
     foreach ($files as $key=>$value) { 
      $zip->addFile($value); 
     } 
     $status=$zip->getStatusString(); 
     $zip->close(); 

    if(!$zipname) 
    { 
     echo "Nothing in Basket"; 
    } 
    else 
    { 
     // to fix your corrupt zip file, remove this line. 
     echo 'THIS IS AN EXAMPLE DEBUG: ' . $zipname; 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/zip'); 
     header('Content-Disposition:attachment; filename='.basename($zipname)); 
     header('Content-Length:'.filesize($zipname)); 
     readfile($zipname); 
    } 
} 
1

aggiunta a questa discussione anche se il problema originale è stato risolto da quando appena trascorso un paio d'ore con un problema simile.

Si scopre che tutti i file devono esistere quando si esegue $ zip-> close(), indipendentemente da quando si utilizza $ zip-> addFile() per aggiungerli.

Quindi se si creano file temporanei, li si aggiunge al file zip e quindi li si elimina prima di aver usato close(), si potrebbe finire con un archivio vuoto/danneggiato.

0

Ho risolto lo stesso problema spostando il codice nella stessa cartella in cui si trovavano i file che volevo aggiungere all'archivio Zip.

Problemi correlati