2011-01-10 6 views
13

Ho scritto questo codice per creare un file ZIP e per salvarlo. Ma in qualche modo non mostra alcun errore, ma non crea nemmeno un file ZIP. Ecco il codice:Nessun errore durante la creazione di zip, ma non viene creato

$zip = new ZipArchive; 
$time = microtime(true); 
$res = $zip->open("maps/zips/test_" . $time . ".zip", ZipArchive::CREATE); 
if ($res === TRUE) { 
    echo "RESULT TRUE..."; 
    $zip->addFile("maps/filename.ogz","filename.ogz"); //Sauerbraten map format 
    $zip->addFromString('how_to_install.txt', 'Some Explanation...'); 
    $zip->close(); 
    $zip_created = true; 
    echo "FILE ADDED!"; 
} 

Cosa sto facendo male e come posso risolvere il problema?

+0

Le uscite "RISULTATO VERO" e "FILE AGGIUNTO" sono? Stai cercando nella cartella giusta? Hai abilitato la segnalazione degli errori?domande, domande: P – PeeHaa

+1

Hai controllato che PHP abbia accesso in scrittura a quella directory? – alexn

+0

Nooo! : D alexn aveva ragione! Lo script non aveva abbastanza diritti di accesso ... grazie per la soluzione. Contrassegnerei la risposta corretta se la pubblichi a breve ...? –

risposta

14

Probabilmente apache o php non ha le autorizzazioni per creare archivi zip in tale directory. Da uno dei commenti su ZipArchice::open:

Se la directory si sta scrivendo o risparmio in non ha il permessi set corretto, non sarà possibile ottenere alcun messaggio di errore e sarà simile tutto ha funzionato bene ... tranne che non sarà cambiato!

Invece assicurarsi di raccogliere il valore di ritorno di ZipArchive :: close(). Se è falso ... non ha funzionato.

Aggiungi una clausola else al vostro if e fare uscire $ res per vedere i risultati:

if($res === TRUE) { 
    ... 
} else { 
    var_dump($res); 
} 
+2

Si è imbattuto in questo problema a un certo punto. Anche il controllo con is_writable() aiuta in anticipo .. in PHP aiuta davvero a farlo prima di qualsiasi scrittura, solo per essere sicuri. – kander

+0

@alexn Mi sono assicurato di avere i permessi di scrittura per le mie directory, tuttavia il metodo close() mi dà FALSE. Come dovrei fare? Oltre alle autorizzazioni, ci sono altre possibilità? –

1

pausa in fasi.

if ($res === TRUE) { 

    check if file_exist 

check if addFile give any error 
} 

if($zip->close()) 
{ 
$zip_created = true; 
    echo "FILE ADDED!" 
} 

Controllare il phpinfo per zip è abilitato o meno :)

5

Partenza che ognuno dei vostri file esiste prima di chiamare $ archivio zip> addfile altrimenti la zip non verrà generato e nessun messaggio di errore essere visualizzato.

if(file_exists($fichier->url)) 
{ 
    if($zip->addFile($fichier->url,$fichier->nom)) 
    { 
     $erreur_ouverture = false; 
    } 
    else 
    { 
     $erreur_ouverture = true; 
     echo 'Open error : '.$fichier->url; 
    } 
} 
else 
{ 
    echo 'File '.$fichier->url.' not found'; 
} 
8

Ci sono 2 casi in cui zip non genera l'errore.

  1. Assicurarsi che ogni file che si sta aggiungendo allo zip sia valido. Anche se un file non è disponibile quando viene chiamato
    zip->close, l'archivio non riuscirà e il file zip non verrà creato.
  2. Se la cartella non dispone di autorizzazioni di scrittura , zip non segnalerà l'errore. Finirà ma non verrà creato nulla.
+0

Ottimo! nel mio caso, ho bisogno di cancellare due dump di DB dopo averli aggiunti a ZIP, li ho cancellati subito dopo "$ zip-> addFile (...", quindi quando $ zip-> close() è stato chiamato fallito !, Ora sto testando se $ zip-> close() restituisce true, in tal caso, quindi elimino i dump di DB. – razor7

+0

Grazie, l'opzione 1 ha risolto il problema! –

4

Ho avuto esattamente lo stesso problema, anche quando con permessi di scrittura/lettura completi.

risolto creando il file ".zip" manualmente prima di passarlo al ZipArchive:

$zip = new ZipArchive; 
$time = microtime(true); 
$path = "maps/zips/test_" . $time . ".zip" 

touch($path); //<--- this line creates the file 

$res = $zip->open($path, ZipArchive::CREATE); 
if ($res === TRUE) { 
    echo "RESULT TRUE..."; 
    $zip->addFile("maps/filename.ogz","filename.ogz"); //Sauerbraten map format 
    $zip->addFromString('how_to_install.txt', 'Some Explanation...'); 
    $zip->close(); 
    $zip_created = true; 
    echo "FILE ADDED!"; 
} 
+1

Ho visto questo comportamento anche quando uso $ zip-> apri ($ file, ZipArchive :: OVERWRITE). Utilizzando un tocco appena sentito sbagliato, ho trovato un commento su http://php.net/manual/en/ziparchive.open.php da eric a webdeveric dot com, che suggeriva $ zip- > open ($ file, ZipArchive :: CREATE | ZipArchive :: OVERWRITE), che funziona - sia per la creazione che per la sovrascrittura. – Anthony

+0

Yeeeeea, ha funzionato, grazie mille – Husam

1

Uno dei motivi per i file zip non è creato è dovuto alla mancanza di controllo se si aggiunge il file e non un directory.

if (!$file->isDir()) 

Ho trovato la soluzione here.

Problemi correlati