Gestire archivi .rar in PHP

Giovanni Canella

31/03/2016

1204

Ipotizziamo questo scenario: un utente ha inviato un archivio .rar e ora dobbiamo processarlo con PHP scompattando i files in una cartella e gestirli poi successivamente. Come facciamo? In questo articolo vediamo le funzioni giuste che ci aiuteranno nell'impresa!

Il formato .rar (arconimo di Roshal Archive) è stato sviluppato dall'ingegnere russo Eugene Roshal nel 1993, e rilasciato sotto licenza shareware, fatta eccezione per il codice di de-compressione reso disponibile open soruce.Offre un buon rapporto di compressione, a volte a discapito della velocità, e di sicurezza grazie all'algoritmo di criptazione AES. Permette inoltre di creare archivi solidi dove i file invece di essere compressi uno ad uno, vengono trattati come se fosse solo uno: questo permette di ridurre notevolmente le dimensioni dell'archivio, però nel caso che per un qualunque motivo si dovesse corrompere, non c'è possibilità di recuperare i dati.

 

Per gestire questo formato con PHP useremo la classe RarArchive(), anche se, come qualcuno avrà già capito, non potremo creare e/o inserire file perchè l'algoritmo di compressione è proprietario e non supportato dalla classe, quindi ci limiteremo a estrarre e ottenere informazioni da quest'ultimo. Per chi ha la necessità per il proprio progetto di eseguire più operazioni, potete interrompere qui la lettura e utilizzare uno degli altri formati che illustrerò in questo articolo.

Chiusa questa parentesi, di seguito i metodi principali: 

open($ARCHIVIO, $PASSWORD = NULL)
 

Apre l'archivio .rar definito e nel caso sia criptato, passiamo la sua relativa password in chiaro come secondo parametro.

$rar = new RarArchive();
$risultato = $rar->open("archivio.rar", "EventualePassword");
if ($risultato === TRUE) {
    echo("Archivio aperto con successo! :D");
} else {
    echo("Impossibile aprire l''archivio .rar :(");
}

getEntries() 

Ottiene la lista intera degli elementi presenti dentro l'archivio, e restituisce un oggetto RarEntry, con cui possiamo accedere ai seguenti metodi. 

$elementi = $risultato->getEntries();
if ($elementi === TRUE) {
    echo "Trovati " . count($elementi) . " elementi:";
    
    foreach ($elementi as $elemento) {
        echo "Nome: " . $elementi->getName();
    }    
} else {
    echo("Impossibile ottenere gli elementi! :(");
}

Il cui output sarà:

Trovati 4 elementi:
Nome: ginho.txt
Nome: articoli.txt
Nome: php.txt
Nome: money.txt

Per estrarre il singolo file usiamo: 

$elementi->extract("archivio/");

Altrimenti inseriamo la precedente istruzione dentro il ciclo foreach.

Altri metodi che ci potrebbero tornare utili sono:

  • getVersion(): Determina la versione minima con cui l'archivio può essere aperto,
  • isDirectory(): Come possiamo intuire determina se l'elemento selezionato, dentro il ciclo foreach, è una cartella o meno.
  • isEncreypted(): Determina se l'elemento è criptato o meno.
  • getUnpackedSize(): Ottiene la dimensione in byte del file estratto.
  • getFileTime(): Restituisce l'ultima data di modifica dell'elemento secondo il formato YYYY-MM-DD HH:II:SS.

isSolid()

Determina se l'archivio è un archivio solido. Restituisce TRUE in caso positivo, FALSE in caso contrario.
 

if($rar->isSolid()) {
    echo "L'archivio è solido!";
} else {
    echo "L'archivio non è solido!";
}

isBroken()

Determina se l'archivio è corrotto o meno. E' consigliabile utilizzare la funzione immediatamente dopo aver aperto l'archivio. Restituisce TRUE in caso positivo, FALSE in caso contrario. 

if($rar->isBroken()) {
    echo "L'archivio è a posto! :D";
} else {
    echo "L'archivio non è corrotto! D:";
}

Esempio generale

$rar = RarArchive::open($_SERVER["DOCUMENT_ROOT"] . "archivio.rar");
if ($rar === TRUE) {
    $elementi = $risultato->getEntries();
    if ($elementi === TRUE) {
        echo "Trovati " . count($elementi) . " elementi";
        
        foreach ($elementi as $elemento) {
            echo "Nome: " . $elementi;
            $elemento->extract("archivio/);
        }    
    } else {
        echo("Impossibile ottenere gli elementi! :(");
    }
} else {
    echo("Impossibile aprire l''archivio .rar :(");
}

In questo esempio generale apriamo l'archivio .rar, otteniamo tutti gli elementi stampando i loro nomi a video e li estraiamo nella cartella "archivio/".

 

Fatta questa piccola panoramica sui principali metodi per la gestione di archivi .rar, il mio consiglio personale è di non utilizzare questo formato e limitarci ad usarlo solo quando siamo "obbligati" dato che abbiamo poche possibilità di modifica.

Ti potrebbero interessare

I più letti