Skip to main content

Arxiu ZIP temporal

Aquest exemple il·lustra una pràctica de codificació molt important i eficient: la creació de fitxers temporals per a processos que no requereixen emmagatzematge permanent, en aquest cas, un arxiu ZIP. L'exemple gestiona la neteja del fitxer temporal.

L'objectiu principal d'aquest codi és generar un arxiu ZIP que només existirà el temps necessari per ser creat i, habitualment, enviat a l'usuari (per descarregar).

Element Funció Explicació
tempnam() Creació del nom únic Aquesta funció genera un nom de fitxer únic i aleatori al sistema. Això evita conflictes si molts usuaris intenten generar un ZIP alhora.
sys_get_temp_dir() Directori de destí Retorna la ruta del directori on el sistema operatiu desa habitualment els fitxers temporals (per exemple, /tmp a Linux o C:\Windows\Temp a Windows).
ZipArchive::OVERWRITE Mode d'obertura S'utilitza per assegurar que si tempnam ha creat el fitxer, ZipArchive el sobreescriu per garantir que sigui un arxiu ZIP buit i vàlid.

El procés de creació, d'obertura amb OVERWRITE, d'afegir contingut amb addFile i de tancament amb close() és idèntic al procés de creació d'un ZIP permanent, però la clau és la ubicació i el nom generat per tempnam().

Exemple

El risc principal del codi és que no esborri el fitxer temporal després d'utilitzar-lo. Això pot omplir ràpidament el directori temporal del servidor i causar problemes d'emmagatzematge. Per això cal incloure la neteja (unlink) i una bona gestió d'errors.

PHP
<?php

/**
 * Funció per crear un ZIP temporal, afegir fitxers i retornar la seva ruta.
 *
 * @param array $files_to_add Array associatiu amb: [Ruta_Real_Disc => Nom_Dins_ZIP]
 * @return string|bool Retorna la ruta temporal del ZIP o FALSE en cas d'error.
 */
function create_temp_zip_archive(array $files_to_add): string|bool
{
    // 1. Creació del Nom i la Ruta Temporal
    // Prefix "INF" per identificar la font dels arxius temporals.
    $temp_zip_file = tempnam(sys_get_temp_dir(), "INF");

    $zip = new ZipArchive;
    $res = $zip->open($temp_zip_file, ZipArchive::OVERWRITE);

    if ($res !== TRUE) {
        // En cas d'error en l'obertura/creació
        return false; 
    }

    // 2. Afegir Fitxers
    foreach ($files_to_add as $real_path => $entry_name) {
        if (file_exists($real_path)) {
            $zip->addFile($real_path, $entry_name);
        } else {
            // Opcionalment, podríem registrar un error o continuar.
            // Aquí continuem per si de cas només un dels fitxers falla.
        }
    }

    // 3. Tancament (Finalització del ZIP)
    $zip->close();
    
    // 4. Retornar la ruta temporal
    return $temp_zip_file;
}


// ---------------------------------------------------------------------------------
// CAS D'ÚS D'EXEMPLE
// ---------------------------------------------------------------------------------

// Simulem la creació de dos fitxers que s'adjuntaran
file_put_contents('document1.pdf', 'Contingut del PDF 1...'); 
file_put_contents('imatge_logo.png', 'Dades binàries...');

$files = [
    'document1.pdf' => 'informes/document_final.pdf',
    'imatge_logo.png' => 'assets/logo.png',
];

$zip_path = create_temp_zip_archive($files);

if ($zip_path) {
    echo "Fitxer ZIP temporal creat correctament a: {$zip_path}";
    
    // CAS D'ÚS: Enviament per descarregar (simulació)
    // 1. Enviar el fitxer al navegador
    // header('Content-Type: application/zip');
    // header('Content-Disposition: attachment; filename="paquet_de_documents.zip"');
    // readfile($zip_path); 
    
    // 2. Neteja obligatòria del zip temporal
    unlink($zip_path);
    echo "<br>🗑️ Arxiu temporal ({$zip_path}) esborrat correctament.";

} else {
    echo "Error en la creació de l'arxiu ZIP temporal.";
}

// Neteja dels fitxers de simulació
unlink('document1.pdf');
unlink('imatge_logo.png');
?>

Descàrrega múltiples arxius

La creació d'un ZIP temporal és la solució ideal per a un dels casos més comuns en aplicacions web:

Escenari: Descàrrega de documents personalitzats

Un usuari vol descarregar totes les seves factures de l'últim any.

  1. El codi PHP recupera les rutes de les 12 factures (guardades en un directori segur del servidor).

  2. Crida a la funció create_temp_zip_archive() per empaquetar les 12 factures en un sol fitxer ZIP temporal.

  3. Utilitza les funcions header() i readfile() de PHP per enviar el contingut del ZIP directament al navegador de l'usuari.

  4. Un cop enviat, s'executa unlink($zip_path) per esborrar immediatament el fitxer del servidor, garantint que no quedi cap còpia residual al directori temporal.

D'aquesta manera, el servidor utilitza només recursos temporals per gestionar una descàrrega de fitxers combinats, maximitzant la seguretat i minimitzant l'ús de disc.