2013-08-23 24 views
7

programmatori Compagni:ZipArchive PHP aggiungendo solo i file senza directory dall'intero percorso

odio di fare questa domanda, come è stato, I belive risposto correttamente due volte:

  1. Here

  2. And here

Così il pr oblem è: quando si decomprime il file scaricato "file.zip", dopo aver decompresso, contiene tutte le cartelle del percorso, anche se ho specificato il file locale nella funzione addFile. Mi piacerebbe che il file zip non contenga alcuna sottocartella, solo file.

$zipname = str_replace(' ', '_', $obj['Name']) . '.zip'; 

$zip = new ZipArchive(); 

$zip->open($zipname, ZipArchive::CREATE); 
foreach ($files as $file) { 
    // $file looks like this: webroot/uploadify/files/file.jpg 
    $zip->addFile($file, pathinfo($file, PATHINFO_BASENAME)); 
} 

$zip->close(); 

header('Content-Description: File Transfer'); 
header('Content-Transfer-Encoding: binary'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header("Content-type: application/zip"); 
header("Content-Disposition: attachment; filename=" . $zipname); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
header('Content-Length: ' . filesize($zipname)); 

readfile($zipname); 

Qualcuno può vedere qual è il problema con questo codice?

Ulteriori informazioni:

I, OFC, utilizzare i percorsi relativi alla Webroot, ma la gerarchia di cartelle nella cartella estratta dopo: estratto su File -> 'my_file.zip' è C-> xampp -> htdocs-> my_cakephp_web_app-> app->> webroot- file che non è esattamente quello che volevo ottenere :)

PHP 5.4.4

Windows XP, XAMPP

EDIT

Provato utilizzando la libreria http://www.phpconcept.net/pclzip/ e ha avuto lo stesso problema. Anche sul mio PC di casa (win7) questo codice ha funzionato bene.

Questo fa sorgere una domanda: Ci sono delle impostazioni che dovrei incontrare di cui non sono a conoscenza?

risposta

2

è necessario testare ogni file per vedere se si tratta di un file (piuttosto che una directory, collegamento simbolico, ecc):

foreach ($files as $file) 
{ 
    if(filetype($file) == 'file') { 
     $zip->addFile($file, pathinfo($file, PATHINFO_BASENAME)); 
    } 
} 

Questo sta usando filetype, ma si potrebbe anche usare is_file.

+0

non ha aiutato, si comporta ancora allo stesso modo .. –

+0

Se hai tempo, dai un'occhiata alla mia risposta per favore e fammi sapere perché funziona :) –

4

Ho eseguito il codice e funziona come previsto. Quindi ci sono 3 cose che potrebbero andare storte da quello che posso vedere.

Provare a utilizzare questi flag nel caso in cui un vecchio file esista ancora e non venga sovrascritto (non è chiaro cosa $ obj ['Nome'] è impostato su) Se si leggono i commenti nel manuale php, lì hanno vari gradi di successo usando ZIPARCHIVE :: CREATE vs ZIPARCHIVE :: OVERWRITE, quindi forse funzionerà entrambi.

$zip->open($zipname, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); 

Pathinfo potrebbe essere difettosa e il ritorno l'intero percorso o nullo per qualche motivo

E 'possibile fare un var_dump sull'uscita pathinfo, solo per confermare che è quello che si aspetta che sia?

foreach ($files as $file) 
{ 
    var_dump(pathinfo($file, PATHINFO_BASENAME)); 

    // $file looks like this: webroot/uploadify/files/file.jpg 
    // $zip->addFile($file, pathinfo($file, PATHINFO_BASENAME)); 
} 

Forse c'è un bug con la versione/php os con funzione di addfile (improbabile, afferrare a cannucce qui come non riesco a vedere alcun altra spiegazione)

+0

Se hai tempo, dai un'occhiata a la mia risposta per favore e fammi sapere perché funziona :) –

1

Non ho assolutamente idea del perché questo è lavorando :)

avrei realtà credo che il mio PC è entrato in una modalità di Skynet e ottenuto il metodo addfile di lavorare in qualche modo :)

Chiunque può plausibilmente spiegare cosa è successo otterrà il 50 bonus :)

$zipname = str_replace(' ', '_', $obj['Name']) . '.zip'; 

    $zip = new ZipArchive; 

    $zip->open($zipname, ZipArchive::CREATE); 

    foreach ($files as $file) 
    { 
     // the str_replace made it work??? 
     $zip->addFile(str_replace('/webroot', '', getcwd() . '/' . $file), pathinfo($file, PATHINFO_BASENAME)); 
    } 

    $zip->close(); 

    header("Content-type: application/zip"); 
    header("Content-Disposition: attachment; filename=" . $zipname); 
    header('Content-Length: ' . filesize($zipname)); 

    readfile($zipname); 

EDIT:

Inoltre, dopo aver un po 'di problemi con i file temporanei non deleteing se stessi, sono passato a http://www.phpconcept.net/pclzip/, che funziona bene.

Inoltre, Alix Axel menzionato PharData seguito, data la quantità di punteggio che ha guadagnato qui, sto considerando il suo approccio così ..

+0

Solo curioso di sapere qual è il valore di getcwd(). Sembra che tu stia traducendo un percorso relativo verso un percorso assoluto. – bumperbox

+0

Questo è dal primo commento sul manuale php per $ zip-> addFile. Attenzione: chiamare $ zip-> addFile() su un file che non esiste riuscirà e restituirà VERO, ritardando l'errore fino a quando non si effettua la chiamata finale $ zip-> close(), che restituirà FALSE e potenzialmente lascerà graffiare la tua testa. Se si aggiungono più file in un file zip e la chiamata $ zip-> close() restituisce FALSE, assicurarsi che tutti i file aggiunti effettivamente esistano. È anche una buona idea controllare ogni file con file_exists() o is_readable() prima di chiamare $ zip-> addFile() su di esso. – bumperbox

+0

getcwd() restituisce "C: \ xampp \ htdocs \ test_tool \ app \ webroot". Leggete anche quel commento e pensate che dal momento che l'archivio zip è in fase di creazione, funziona (dovrebbe aver stampato $ zip-> close(), saprà la prossima volta quando si hanno problemi). –

2

In PHP 5.3 questo dovrebbe farlo:

$phar = new PharData('file.zip'); 

// add all files in the folder, only include files with extensions 
$phar->buildFromDirectory('/directory', '~[.][0-9a-z]+$~i'); 

È inoltre possibile utilizzare PharData::buildFromIterator con il flag LEAVES_ONLY.

+0

Ciao, ho provato il tuo codice in questo modo: '$ phar = nuovo PharData ('tmp_zips/file.zip'); $ far-> buildFromDirectory ('/ uploadify/files/test1', '~ [0-9a-z] + $ ~ i [.]'); ' ho ottenuto questo errore: ' RecursiveDirectoryIterator :: __ construct (/ uploadify/files/test1,/uploadify/files/test1): il sistema non riesce a trovare il percorso specificato. (codice: 3) ' –

+0

@IgorLacik: sembra suggerire che hai digitato erroneamente il tuo percorso. –

Problemi correlati